본 게시글은 하단 책을 읽고 학습한 내용을 제 생각으로 요약, 정리한 글입니다.
목차
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 클래스();
- 새로운 객체를 하나 생성해 그 객체의 주소값을 객체 참조 변수에 할당
- 추상화 과정
- 객체 생성 → 속성 값 저장 위한 메모리 공간이 힙 영역에 할당됨
- 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객체와 다른 새로운 것임
1. 클래스 모델링
→ 해당 클래스의 객체들로부터 공통 특성 뽑아내기
ex) 쥐: 성명, 나이, 꼬리수, 울다()
2. 만든 클래스를 가지고 객체 생성
- 클래스 멤버와 객체 멤버
- 클래스 멤버 = static 멤버 = 정적 멤버
- [스태틱] 객체가 아닌 클래스에 속해있어 JVM 구동 스태틱 영역에 바로 배치됨
- 정적 멤버 메서드: 객체들의 존재 여부와 관계 없이 쓸 수 있어야 할 때
- 정적 멤버 속성: 클래스의 모든 객체가 같은 값 가질 때
- 객체 멤버 = 인스턴스 멤버 = 오브젝트 멤버
- [힙] 객체 생성자 호출 시 힙 영역에 배치됨
- 클래스의 멤버 메서드(main())와 객체의 멤버 메서드(sing())는 static 키워드로 구분됨
- UML 표기법에서 클래스의 멤버 메서드는 밑줄을 긋고 객체의 멤버 메서드는 밑줄을 긋지않음.
- main()메서드가 클래스 멤버 메서드(정적 메서드)여야 하는 이유
- main() 메서드의 논리를 함수로 분할해서 사용하는 경우
- 정적 변수에 대한 접근자 메서드(getter)와 설정자 메서드(setter)로 사용하는 경우
- 클래스의 인스턴스를 만들지 않고 사용하게 되는 유틸리티성 메서드의 경우
- 꼬리 개수처럼 모든 객체가 같은 값을 갖고 있는 속성은 그 값을 클래스에 저장
클래스 멤버 메서드와 객체 멤버 메서드
→ static 붙으면 클래스의 멤버 메서드임
→ T 메모리 초기화된 순간 객체가 하나도 없어서 객체의 멤버 메서드는 실행 불가해서
main()메서드 이외에 정적 메서드 사용하는 경우
클래스 멤버 속성(static 변수)과 객체 멤버 속성(인스턴스 변수)
→ how? static 키워드를 속성 앞에 붙임 (클래스의 멤버 속성)
→ [스태틱] 꼬리 개수 속성은 스태틱 영역에 단 하나의 저장공간 갖게 됨
→ jerry(객체명).contOfTail 혹은 Mouse(클래스명).contOfTail로 접근 가능
- 변수 정리
- static 변수: 클래스 멤버 속성(변수)
- [스태틱] 영역
- 자동 초기화
- 전역 변수(공유 변수)
- 인스턴스 변수: 객체 멤버 속성(변수)
- [힙] 영역
- 자동 초기화
- 다수의 객체 메서드가 공유(공유 변수)
- 지역 변수
- 초기화 안하면 쓰레기값
- [스택] 영역
- 멤버 속성(변수)들을 자동 초기화 해주는 이유: 공유 변수 성격 가져서 딱히 누가 초기화해야 한다고 규정할 수 없어서
5. 상속(재사용과 확장)
- 상속: 상위 클래스(동물)의 특성을 하위 클래스(강아지)에 상속하고, 거기에 더해 필요한 특성을 추가해 사용
- 즉, 하위 클래스는 상위 클래스의 특성을 재사용하면서 더 확장(세분화)한 것임
- ex) 강아지(하위 클래스)는 동물(상위 클래스)이면서 멍멍 짖는다.
- 결과적으로, 특성 개수로 따지면 하위 클래스(동물의 특성+멍멍 짖는 특성) > 상위 클래스(동물의 특성)
- 상위 클래스(동물)일수록 추상화, 일반화 된 것.
- 하위 클래스(강아지)일수록 구체화, 특수화 된 것.
- ”하위 클래스는 상위 클래스다.”
- ex) 강아지는 동물이다!
- 자바에서 상속 → extends(확장) 키워드 사용
- 상속의 강력함
- 코드 작성 전 유의할 점: 클래스명(동물, 강아지)은 분류스럽게, 객체 참조 변수명(검둥이, 흰둥이)은 유일무이한 사물스럽게!
- 상위 클래스에서만 showMe() 메서드를 구현했지만, 모든 하위 클래스의 객체에서 showMe() 메서드를 사용 가능! (재사용)
- “강아지는 동물이다”라는게 표현됨. 인간 논리를 코드로 구현 가능!
- 반복문 하나로 각기 다른 클래스(동물, 강아지)의 객체들을 한 번에 접근 가능
동물.java
강아지.java
Driver01.java → 상속의 장점 1: 재사용
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](~)
- 객체 멤버의 접근 제어자
- 정적 멤버(클래스 멤버)의 접근 제어자
- 참조 변수의 복사
