리셋 되지 말자

4일차 - 자바와 객체 지향 본문

Java(폐지)/Java 공부

4일차 - 자바와 객체 지향

kyeongjun-dev 2020. 7. 14. 15:13
  • 코드를 논리적인 단위로 구분하고 분할하는 구조적 프로그래밍의 '함수' -> '객체 지향'

객체 지향을 이해하기 위한 큰 그림

  • 세상에 존재하는 모든 것은 사물, 즉 객체(object)이다.
  • 각각의 사물은 고유하다.(먼소리지?)
  • 사물은 속성을 갖는다.
  • 사물은 행위를 한다.

사물을 하나하나 이해하기보다는 사물을 분류(class)해서 이해하는 인간의 인지법

  • 직립보행을 하며 말을 하는 존재를 사람이라고 분류한다.
  • 연미복, 짧은 다리, 날지 못하는 새를 펭귄이라고 분류한다.
  • 밤하늘에 반짝이는 사물들을 별이라고 분류한다.

클래스, 객체, 속성, 메서드 간단 예시

Class 명 사람 홍길동
속성들 나이, 몸무게, 키 나이:19, 몸무게:80, 키:180
행위들 먹다, 자다 먹다, 자다

객체지향의 4대 특성

  • 캡슐화(Encapsulation): 정보 은닉(information hiding)
  • 상속(Inheritance): 재사용 -> 잘못된 단어라고 한다. 염두해 두자!
  • 추상화(Abstraction): 모델링
  • 다형성(Polymorphism): 사용 편의

1. 클래스 vs 객체 = 붕어빵 틀 vs 붕어빵 ??

(이렇게 알고 있었는데 아니라네 ㅋㅋㅋㅋㅋ)

  • 클래스 객체명 = new 클래스();
  • 붕어빵틀 붕어빵 = new 붕어빵틀(); // ?? 붕어빵'틀'을 만들었는데 붕어빵이 나온다. 이상하다
  • ex) 금형기계 붕어빵틀 = new 금형기계();
    -> 새로운 금형기계를 하나 만들었더니 붕아빵틀이 되었다?
  • 붕어빵에게 붕어빵틀은 팩터리다. (팩터리는 디자인 패턴. 여기서는 일단 넘어감)

클래스 객체 구분 예시

  • 사람 : 클래스, 김연아 : 객체
  • 펭귄 : 클래스, 뽀로로 : 객체

추상화:모델링

  • "추상화는 곧 모델링이다"
  • 추상화란 구체적인 것을 분해해서 관찰자가 관심 있는 특성만 가지고 재조합하는 것이라고 정리할 수 있다.

객체와 클래스

  • 객체: 세상에 존재하는 유일무이한 사물

  • 클래스: 분류, 집합, 같은 속성과 기능을 가진 객체를 총칭하는 개념
    -> 어려우면 그냥 '클래스:객체=펭귄:뽀로로=사람:홍길동'을 기억하자

  • 객체(object): 클래스의 인스턴스 (클래스를 이용해서 object를 만들었다는 것을 강조할 때 instance라는 표현을 씀)

사람 클래스 예시

사람

시력

몸무게

혈액형

나이

직업

연봉

먹다()

자다()

일하다()

운전하다()

입금하다()

그래서, 추상화가 왜 모델링일까?

  • Context라고 불리기도 하는 '어플리케이션 경계(Application Boundary)'라는 개념이 있다.
    -> '내가 만들고자 하는 어플리케이션은 어디에서 사용될 것인가?' 라는 개념이다.
    • 예를들어, 병원 어플리케이션이라면 '사람'클래스를 '환자'를 의미하는 구체적인 이름으로 변경이 가능하고, 이에 따라 필요한 특성들도 달라지게 된다. ex) 직업, 연봉은 삭제하고 혈액형, 시력 추가
    • 즉, 추상화란 '구체적인 것을 분해해서 관심 영역(어플리케이션 경계)에 있는 특성만 가지고 재조합 하는것'이고 이것이 곳 '모델링'이다.
    • '모델'은 실제 사물을 정확히 복제하는 것이 아니라 추상화를 통해 실제 사물을 단순하게 묘사하는 것이다.
      -> 모델링(추상화)는 객체 지향에서 클래스를 설계할 때 필요하고, DB의 테이블을 설계할 때도 필요하다.

중요한 부분 정리

  • OOP의 추상화는 모델링이다.
  • 클래스:객체=펭귄:뽀로로
  • 클래스 설계에서 추상화가 사용된다.
  • 클래스 설계를 위해서는 어플리케이션 경계부터 정해야 한다.
  • 객체 지향에서 추상화의 결과는 클래스이다.

추상화의 넓은 개념

  • 상속을 통한 추상화, 구체화
  • 인터페이스를 통한 추상화
  • 다형성을 통한 추상화

자바는 객체 지향의 추상화를 어떻게 지원하는가?

  • class 키워드를 통해 지원한다.
    -> 추상화 = 모델링 = 자바의 class 키워드

자바에서의 클래스와 객체 관계 표현

클래스 객체_참조_변수 = new 클래스();

클래스

객체_참조_변수

=

new

클래스

()

객체_참조_변수의 자료형(Type)

생성된 객체를 참조할 수 있는 변수

할당문

새로운

만들고자 하는 객체의 분류

메서드

     

클래스의 인스턴스, 즉 객체를 생성하기 위해 객체 생성자를 호출

새로운 객체를 하나 생성해 그 객체의 주소값(포인터)을 객체 참조 변수에 할당

class 예제

  • Mouse.java
package abstraction01;

public class Mouse {
    public String name;
    public int age;
    public int contOfTail;

    public void sing() {
        System.out.println(name+"찍찍!!");
    }
}
  • MouseDriver.java
package abstraction01;

public class MouseDriver {
    public static void main(String[] args) {
        Mouse mickey = new Mouse();
        mickey.name="미키";
        mickey.age=85;
        mickey.contOfTail=1;

        mickey.sing();

        mickey=null;

        Mouse jerry = new Mouse();
        jerry.name="제리";
        jerry.age=73;
        jerry.contOfTail=1;

        jerry.sing();
    }
}
  • MouseDriver.java의 4번째 줄이 실행되기 전의 T 메모리 상태
    -> java.lang 패키지와 다른 패키지들이 모두 static 영역에 배치된다. 그런데 Mouse 클래스의 변수 name, age, countOfTail에 변수 저장 공간이 안보인다. 이는 변수 선언이 static으로 되지 않았기 때문이다.
    -> 이 세 개의 속성은 Mouse 클래스에 속한 속성이 아닌 Mouse 객체에 속한 속성이다.객체가 생성되어야만 속성의 값을 저장하기 위한 메모리 공간이 스태틱 영역이 아닌 힙 영역에 생기게 된다.
  • UML 표기법에 따르면 클래스 멤버 메서드와 객체의 멤버 메서드는 밑줄을 이용해 구분되어 표시된다.

 

1. Mouse mickey 구문에 의해 Mouse 타입의 객체를 참조할 수 있는 객체 참조 변수 mickey가 T메모리의 stack 영역에 있는 main() 스택 프레임 안에 생성된다.

2. new Mouse() 구문이 실행되어 힙 영역에 객체가 생성된다.

3. 이제 Mouse mickey = new Mouse();에서 배정문의 차례이다. 힙 영역에 생성된 인스턴스의 시작주소가 100이라고 가정하면 아래와 같이 객체 참조 변수인 mickey에 할당되는 값은 100이다.

4. 객체 참조 변수 mickey가 Mouse 객체의 주소(포인터)를 갖고 있다는 것을 화살표로 표현하기도 함.

5. 이제 객체 참조 변수인 mickey를 통해 객체의 속성에 값을 할당한다.

6. 이제 mickey.sing() 차례인데, T 메모리에는 변화가 없다. sing() 메서드가 코드 실행 영역에서 실행되어 화면에 "미키 찍찍!!"을 출력한다.

 

7. micky=null; 구문에서는 아래와 같이 객체 참조 변수 mickey의 값이 null로 변경된다.

 

8. :Mouse 객체는 더이상 참조를 당하지 않으므로 '가비지 컬렉터'가 객체를 수거해 간다.(가비지 컬렉터가 언제 오는지는 신만이 안다고 말한다. ㅋ)

9. 객체 참조 변수 jerry가 main() 스택 프레임에 할당되고 값이 입력된다.

10. 코드 실행 영역에서 "제리 찍찍!!"이 화면에 출력되고 main() 메서드 스택 프레임을 종료하는 닫는 중괄호를 만나 프로그램이 종료된다.

Comments