* 발표용이라 비유로 표현한 게 많습니다. 

 

06-1 / 객체 지향 프로그래밍

  • 객체의 정의

객체란 자신의 속성을 가지고 있으면서 식별 가능한 것 (물리적, 추상적 모두)

나라는 사람의 객체가 존재한다면 아래와 같은 속성과 동작으로 구성되어 있고

속성 나의 이름, 나의 성별, 나의 나이 등 자바 필드(field)
동작 코딩하다,  졸다, 공부하다 등 메소드(method)

 

현실 세계의 객체를 가지고 소프트웨어 객체로 설계 객체 모델링 (object modeling)이라고 한다.

 배열 [] 필드 (속성) length 배열의 길이
메소드 (동작) sort() 배열을 정렬하다

 


객체의 상호작용) 

현실에서도 소프트웨어에서도 객체끼리는 서로 상호 작용한다. 그리고 이런 상호작용의 수단이 바로 메소드

객체가 다른 객체의 기능을 이용하는 것이 바로 메소드 호출.

 (ex. 누군가 나에게 편의점에 다녀와 라고 시켰다면 메소드 호출)

 

메소드 호출 형식은 다음과 같다.

리턴값 = 객체.메소드(매개값1, 매개값2, ...);

① 객체에 도트(.) 연산자를 붙이고 메소드 이름을 작성한다. 도트 연산자는 객체의 필드와 메소드에 접근할 때 사용

② 매개값은 메소드를 실행하기 위해 필요한 데이터 

③ 리턴 값은 메소드가 실행되고 난 후 호출한 곳으로 돌려주는 값

int result = Calculator.add(10,20);
System.out.println(result);
// 30 (리턴값)

 

 

 


객체 간의 관계) 

객체는 개별적으로 사용도 가능하지만 대부분 다른 객체와 관계를 맺고 있다.

집합관계 집합관계에 있는 객체 중 하나는 부품 하나는 완성품
(ex. 프로젝트에서 각자가 만든 코드들은 부품, 모두 합친걸 완성품이라 할때 이 둘의 관계는 집합 관계라 할 수 있다.
사용관계 객체 간의 상호작용.  다른 객체의 메소드를 호출하여 원하는 결과를 얻어낸다.
(ex. B반 담임 매니저님께 질문을 한다 (사용관계)
       E반 담임 매니저님께 질문은 불가능하다 (사용관계x)
상속관계 상위(부모) 객체를 기반으로 하위(자식) 객체를 생성하는 관계.
일반적으로 상위객체는 종류, 하위 객체는 구체적인 사물
(ex. 하위 -> 나와 팀원 - 그라우해 스터디팀 - B반 - 항해99 -> 상위

 

 

  • 객체 지향 프로그래밍 정의

만들고자 하는 완성품인 객체를 모델링하고, 집합관계에 있는 부품 객체와 사용관계에 있는 객체를 하나씩 설계한 후 조립하는 방식으로 프로그램을 개발하는 기법

 

 

 


객체와 클래스) 

객체를 만들기 위한 설계도를 클래스(Class)라고 한다. 클래스에는 객체를 생성하기 위한 필드와 메소드가 정의 되어 있다. 클래스로부터 만들어진 객체를 해당 클래스의 인스턴스(Instance)라고 한다. 

하나의 클래스로 여러 인스턴스를 만들 수 있는데 하나의 설계도로 자동차 여러대를 만드는 것과 같다.

 

객체 지향 프로그래밍 개발 3단계

1. 클래스 설계

2. 설계된 클래스로 객체 생성

3. 생성된 객체 이용

 

+ main메소드가 없는 클래스는 객체 생성 과정을 거처 사용

 

 

 


클래스 선언) 

설계도인 클래스에 이름을 정하여 사용하는데 이름에도 규칙이 있다.

- 하나 이상의 문자

- 첫 글자에는 숫자 불가

- $ , _ 외의 특수문자 불가

- 자바 키워드 사용 불가

 

자바언어는 대소문자를 구분하기때문에 클래스 이름도 대소문자를 구분한다.

통상적으로 클래스는 단일 단어 경우 첫글자 대문자에 나머지 소문자

단어가 혼합되어 있다면 각 단어의 첫글자는 대문자로 작성

(ex. String, ArrayList, Caculator 등)

 

클래스 이름을 정했다면 '클래스이름.java'로 소스 파일(프로그래머가 작성한 코드파일)을 생성.

소스파일도 대소문자 구분하여 클래스 이름과 동일하게 생성한다.

 

보통 소스 파일당 클래스는 하나 선언하지만 2개 이상의 클래스도 선언 가능하다

public class Car {
}

class Tier {
}

클래스가 2개 이상 선언된 소스 파일은 컴파일하면 바이트 코드 파일(.class)가 클래스 선언 개수만큼 생긴다. 결국 소스파일은 클래스 선언을 담고 있는 저장 단위일 뿐, 클래스 자체는 아님.

 

+ public 접근 제한자 : public 접근 제한자는 파일 이름과 동일한 이름의 클래스 선언에만 붙일 수 있다.

가급적이면 소스 파일 하나당 동일한 이름의 클래스 하나를 선언하는 것이 좋다

 

 

 


객체 생성과 클래스 변수) 

클래스 선언후 컴파일을 했다면 설계도가 만들어 졌다.

이 클래스에서 객체를 생성하려면 다음과 같이 new 연산자를 사용하면 된다.

클래스 변수; 
변수 = new 클래스();

//------------------------- 위아래 동일

클래스 변수 = new 클래스();

 

new 는 클래스로부터 객체를 생성시키는 연산자이다. 

new 뒤에는 생성자가 오는데 클래스 () 형태이며 new연산자로 생성된 객체는 메모리 힙 영역에 생성된다.

 

객체 지향 프로그램에서는 메모리 내에서 생성된 객체의 위치를 모르면 객체를 사용할 수 없다.  그래서 new 연산자는 힙 영역에 객체를 생성시킨 후 객체의 번지를 리턴한다. 이 주소를 참조 타입인 클래스 변수에 저장해두면 변수를 통해 객체를 사용할 수 있다.

 

아래는 같은 클래스로부터 생성되었지만 new 연산자를 사용한 만큼 객체가 메모리에 생성되어 각각의 객체로 고유한 데이터를 가지고 메모리에서 활동하게 된다.

ArrayList<Integer> arr = new ArrayList<Integer>();
ArrayList<Integer> arr1 = new ArrayList<Integer>();

 

클래스의 용도 2가지

라이브러리용 라이브러리 클래스는 다른 클래스에서 이용할 목적으로 설계 실행용 제외 나머지 모두
실행용 실행 클래스는 프로그램의 실행 진입점인 main() 메소드를 제공하는 역할  프로그램 전체에서 하나

 

아래처럼 라이브러리인 동시에 실행 클래스로 만들수도 있다. (하지만 보통은 분리해서 쓴다)

public class Test {
    public static void main(String[] args) {
    
    }
}

 

 


클래스의 구성 멤버) 

클래스에는 객체가 가져야 할 구성 멤버가 선언된다.

public class ClassName {
	
    int fieldname; // 필드
    ClassName() {...} // 생성자
    void methodName() {...} // 메소드
}
필드
(field)
객체의 고유 데이터, 부품 객체, 상태 정보 저장
선언되는 형태는 변수와 비슷하나 필드를 변수라고 하지 않는다. 
변수는 메소드 내에서만 사용되고 생성자와 메소드 실행 종료시 수명을 다하지만
필드는 생성자와 메소드 전체에 사용되며 객체가 소멸되지 않는 한 객체와 존재한다.
생성자
(contructor)
생성자는 new 연산자로 호출되는 중괄호 {} 블록. 
역할은 객체 생성시 초기화 담당. 필드를 초기화 하거나 메소드를 호출해서 객체를 사용할 준비를 한다. 
생성자는 메소드와 비슷하게 생겼지만. 클래스 이름으로 되어 있고 리턴 타입이 없다. 
메소드
(method)
객체 동작에 해당하는 중괄호 {} 블록.
이 블록은 이름을 가지는데 이것이 메소드의 이름이다. 메소드를 호출하면 {} 안 모든 코드들이 일괄적으로 실행
필드를 읽고 수정하는 역할도 하지만, 다른 객체를 생성해 다양한 기능을 수행하기도
객체 간의 데이터를 전달하는 수단이며 외부로 부터 매개 값을 받아 실행에 이용하고, 실행 후 외부로 리턴할 수도 있다.

 

 

+ Recent posts