📕

[자바 객체 지향] Chapter 3. 자바와 객체 지향

작성일자
Sep 7, 2022
태그
SUB PAGE
프로젝트
자바 객체 지향
책 종류
본 게시글은 하단 책을 읽고 학습한 내용을 제 생각으로 요약, 정리한 글입니다.
목차

1. 객체 지향은 인간 지향이다

  • 객체 지향: 0과 1로 대변되는 기계에 맞춰 사고하던 방식을 버리고,
    • 인간이 현실 세계의 주변 사물(object)을 인지하는 방식대로 프로그래밍 해보자.
    • 직관적.
    • 속성 따로, 메서드 따로가 아닌 객체 단위의 프로그래밍.
  • 객체(사물)(object): 세상에 존재하는 모든 것. ex) 김종민, 한효주, 김연아
    • 각 객체는 고유함. ex) 김종민, 한효주, 김연아
    • 객체는 분류해서 이해됨. ex) 위 예시의 세 객체는 사람이라는 분류(class)에 속함.
    • 객체는 속성을 가짐. ex) 사람이라는 분류 안의 각 객체(김종민)는 나이, 몸무게의 속성 가짐.
    • 객체는 행위를 함. ex) 사람이라는 분류 안의 각 객체(김종민)는 먹다, 자다 등의 행위 가짐.
 

2. 객체 지향의 4대 특성: 추상화, 상속, 다형성, 캡슐화

  • 추상화(Abstraction): 모델링
  • 상속: 재사용과 확장
  • 다형성(Polymorphism): 사용 편의
  • 캡슐화(Encapsulation): 정보 은닉
 

3. 클래스와 객체의 관계(분류와 사물의 관계)

  • 클래스(class): 분류에 대한 개념. 실체가 아님 ex) 사람, 펭귄
    • 객체들을 특성에 따라 분류
    • 같은 속성(필드)과 기능(메서드)을 가진 여러 객체를 총칭하는 집합의 개념
    • 모델링의 결과
    • 속성의 값을 가질 수 없음. 따라서 나이나 제조 일자 없음
  • 객체(object, instance): 실체 ex) 김연아, 뽀로로
    • 세상에 존재하는 유일무이한 사물
    • 속성의 값을 가짐. 따라서 나이나 제조 일자 있음
  • 예시) 사람 줄리엣 = new 사람();
    • 사람이라는 클래스(분류)를 이용해 유일무이하고 새로운 하나의 사람(객체)를 만들어 줄리엣(객체 참조 변수)이라는 이름을 지어준 것임
    •  

4. 추상화(모델링)

  • 추상화: 공통 특성/ 공통 속성 추출
    • 구체적인 것을 분해해서 관심 영역에 대한 특성만 가지고 재조합하는 것
    • 추상화는 곧 모델링임
    • 애플리케이션 경계: 관심 영역
      • → 사람 클래스가 사람 객체들의 모든 특성을 나열할 필요 없음. 만들고자 하는 애플리케이션이 어디에서 사용될 것인가에 따라 클래스 설계가 달라짐.
  • 자바에서 추상화
    • 클래스 객체참조변수 = new 클래스();
    • 새로운 객체를 하나 생성해 그 객체의 주소값을 객체 참조 변수에 할당
  • 추상화 과정
    • 1. 클래스 모델링
      → 해당 클래스의 객체들로부터 공통 특성 뽑아내기
      ex) 쥐: 성명, 나이, 꼬리수, 울다()
       
      2. 만든 클래스를 가지고 객체 생성
      • 객체 생성 → 속성 값 저장 위한 메모리 공간이 힙 영역에 할당됨
      • Mouse mickey = new Mouse();
        • Mouse mickey
          • Mouse 객체에 대한 참조 변수 mickey를 만듬.
          • [스택] main()메서드 스택 프레임 안에 변수 mickey가 생성됨
        • new Mouse();
          • 객체 생성자를 호출해 Mouse 클래스의 인스턴스(객체)를 하나 만들어 힙에 배치함.
          • [힙] 생성된 객체가 힙 영역에 배치됨
        • Mouse mickey = new Mouse();
          • Mouse 객체에 대한 주소를 참조 변수 mickey에 할당함.
          • 객체 참조 변수 mickey가 Mouse 클래스의 인스턴스(객체)를 참조함
      • mickey.name = “미키”;
        • 참조 연산자(.)를 이용해 실제 힙에 있는 객체에 접근 가능
      • mickey = null;
        • 객체 참조 변수 mickey가 더이상 힙 영역에 존재하는 Mouse 객체를 참조하지 않음.
        • 가비지 컬렉터가 아무도 참조하지 않는 Mouse 객체를 수거해감.(힙 영역에서 빠짐)
      • Mouse jerry = new Mouse();
        • 이전에 생성됐다 사라진 Mouse객체와 다른 새로운 것임
  • 클래스 멤버와 객체 멤버
    • 클래스 멤버 = static 멤버 = 정적 멤버
      • [스태틱] 객체가 아닌 클래스에 속해있어 JVM 구동 스태틱 영역에 바로 배치됨
      • 정적 멤버 메서드: 객체들의 존재 여부와 관계 없이 쓸 수 있어야 할 때
      • 정적 멤버 속성: 클래스의 모든 객체가 같은 값 가질 때
    • 객체 멤버 = 인스턴스 멤버 = 오브젝트 멤버
      • [힙] 객체 생성자 호출 시 힙 영역에 배치됨
      클래스 멤버 메서드와 객체 멤버 메서드
      • 클래스의 멤버 메서드(main())와 객체의 멤버 메서드(sing())는 static 키워드로 구분됨
        • → static 붙으면 클래스의 멤버 메서드임
      • UML 표기법에서 클래스의 멤버 메서드는 밑줄을 긋고 객체의 멤버 메서드는 밑줄을 긋지않음.
      • main()메서드가 클래스 멤버 메서드(정적 메서드)여야 하는 이유
        • → T 메모리 초기화된 순간 객체가 하나도 없어서 객체의 멤버 메서드는 실행 불가해서
      main()메서드 이외에 정적 메서드 사용하는 경우
      • main() 메서드의 논리를 함수로 분할해서 사용하는 경우
      • 정적 변수에 대한 접근자 메서드(getter)와 설정자 메서드(setter)로 사용하는 경우
      • 클래스의 인스턴스를 만들지 않고 사용하게 되는 유틸리티성 메서드의 경우
      클래스 멤버 속성(static 변수)과 객체 멤버 속성(인스턴스 변수)
      • 꼬리 개수처럼 모든 객체가 같은 값을 갖고 있는 속성은 그 값을 클래스에 저장
        • → how? static 키워드를 속성 앞에 붙임 (클래스의 멤버 속성)
          → [스태틱] 꼬리 개수 속성은 스태틱 영역에 단 하나의 저장공간 갖게 됨
          → jerry(객체명).contOfTail 혹은 Mouse(클래스명).contOfTail로 접근 가능
  • 변수 정리
    • static 변수: 클래스 멤버 속성(변수)
      • [스태틱] 영역
      • 자동 초기화
      • 전역 변수(공유 변수)
    • 인스턴스 변수: 객체 멤버 속성(변수)
      • [힙] 영역
      • 자동 초기화
      • 다수의 객체 메서드가 공유(공유 변수)
    • 지역 변수
      • 초기화 안하면 쓰레기값
        • [스택] 영역
    • 멤버 속성(변수)들을 자동 초기화 해주는 이유: 공유 변수 성격 가져서 딱히 누가 초기화해야 한다고 규정할 수 없어서
    •  

5. 상속(재사용과 확장)

  • 상속: 상위 클래스(동물)의 특성을 하위 클래스(강아지)에 상속하고, 거기에 더해 필요한 특성을 추가해 사용
    • 즉, 하위 클래스는 상위 클래스의 특성을 재사용하면서 더 확장(세분화)한 것임
      • ex) 강아지(하위 클래스)는 동물(상위 클래스)이면서 멍멍 짖는다.
    • 결과적으로, 특성 개수로 따지면 하위 클래스(동물의 특성+멍멍 짖는 특성) > 상위 클래스(동물의 특성)
    • 상위 클래스(동물)일수록 추상화, 일반화 된 것.
    • 하위 클래스(강아지)일수록 구체화, 특수화 된 것.
  • ”하위 클래스는 상위 클래스다.”
    • ex) 강아지는 동물이다!
  • 자바에서 상속 → extends(확장) 키워드 사용
    • 상속의 강력함
      • 코드 작성 전 유의할 점: 클래스명(동물, 강아지)은 분류스럽게, 객체 참조 변수명(검둥이, 흰둥이)은 유일무이한 사물스럽게!
      • 동물.java
        강아지.java
        Driver01.java → 상속의 장점 1: 재사용
        • 상위 클래스에서만 showMe() 메서드를 구현했지만, 모든 하위 클래스의 객체에서 showMe() 메서드를 사용 가능! (재사용)
        Driver02.java → 상속의 장점 2: 인간의 논리라 객체 지향적
        • “강아지는 동물이다”라는게 표현됨. 인간 논리를 코드로 구현 가능!
        Driver03.java → 상속의 장점 3: 반복문 효과 극대화 (서로 다른 클래스의 객체들 한 번에 접근 가능)
        • 반복문 하나로 각기 다른 클래스(동물, 강아지)의 객체들을 한 번에 접근 가능
    • 하위 클래스 is a kind of 상위클래스
      • is a 관계를 추천하지 않는 이유: “하위 클래스는 하나의 상위클래스”라는 의미가 되어 하위 클래스가 객체처럼 취급되어버림. 하나의 클래스란 하나의 객체이기 때문.
      • is a kind of 관계를 추천하는 이유: “하위 클래스는 상위 클래스의 한 부류”라는 의미가 되어 하위 클래스가 분류/집단(클래스)임을 명확히 드러냄.
        • ex) Dog is a kind of animal.
    • 다중 상속과 자바
    • 상속과 인터페이스
    • 상속과 UML 표기법
    • 상속과 T 메모리
     

    6. 다형성(사용편의성)

    • 오버라이딩 vs 오버로딩
      • 오버라이딩(올라타기)(재정의): 맨 위에 올라탄 존재만 보임
        • 같은 메서드 이름, 같은 인자 목록으로 상위 클래스의 메서드를 재정의
      • 오버로딩(적재하기)(중복정의): 옆으로 적재된 모든 적재물이 다 보임
        • 같은 메서드 이름, 다른 인자 목록으로 다수의 메서드를 중복 정의
    • 다형성과 T 메모리
    • 오버라이딩 장점
      • 상위 클래스 타입의 객체 참조 변수에서 하위 클래스가 오버라이딩한 메서드를 자동으로 호출해줌.
      • 동물들[i]는 동물 클래스 타입인데, 동물 클래스(상위)의 울어보세요() 메서드가 아닌 쥐, 고양이, 강아지, 송아지 클래스(하위) 타입에 맞는 울어보세요() 메서드가 호출됨. 하위 클래스가 상위 클래스의 메서드 오버라이딩 했기 때문임.
    • 오버로딩 장점
      • 함수명 하나만 가지고 인자 목록만 달리하면 돼서 편리함. 만일 오버로딩 지원안하는 언어였다면 인자 목록 달라질 때마다 새로운 이름의 함수 만들어야 함.
     

    7. 캡슐화(정보 은닉)

    • 접근 제어자와 UML 표기법: private(-), protected(#), public(+), [default](~)
    • 객체 멤버의 접근 제어자
    • 정적 멤버(클래스 멤버)의 접근 제어자
    • 참조 변수의 복사
     
    [자바 객체 지향] Chapter 3. 자바와 객체 지향