Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- UXUI기초정복
- 패스트캠퍼스
- 디자인교육
- 백엔드 부트캠프
- 부트캠프
- OPENPATH
- 디자인챌린지
- 오픈챌린지
- 국비지원교육
- 내일배움캠프
- 디자인강의
- 오블완
- 백준
- KDT
- UXUIPrimary
- 백엔드개발자
- 티스토리챌린지
- mysql
- Be
- UXUI챌린지
- 백엔드
- 국비지원취업
- 환급챌린지
- 오픈패스
- Java
- Spring
- 객체지향
- baekjoon
- 내일배움카드
- 국비지원
Archives
- Today
- Total
군만두의 IT 공부 일지
[스터디6] 03. 자바와 객체지향 본문
목차
03. 자바와 객체지향
1. 객체 지향은 인간 지향이다
- 기존의 구조적 프로그래밍 언어에서 중요한 것은 '함수'였다.
- 객체 지향은 주변에서 사물을 인지하는 방식대로 프로그래밍하는 것에서 출발한다.
객체 지향의 큰 그림
- 세상에 존재하는 모든 것은 사물, 즉 객체(object)다.
- 각각의 사물은 고유하다.
- 사물의 속성을 갖는다.
- 사물은 행위를 한다.
2. 객체 지향의 4대 특성 - 캡! 상추다
캡 - 캡슐화(Encapsulation): 정보 은닉(information hiding)
상 - 상속(Inheritance): 재사용
추 - 추상화(Abstraction): 모델링
다 - 다형성(Polymorphism): 사용 편의
3. 클래스 vs. 객체 = 붕어빵틀 vs. 붕어빵 ???
클래스 객체명 = new 클래스();
붕어빵틀 붕어빵 = new 붕어빵틀(); // 새로운 붕어빵틀을 하나 만들었더니 붕어빵이 되었다?
예제에서 붕어빵에게 붕어빵틀은 '붕어빵을 만드는 팩터리'다.
Q. 사람, 김연아, 뽀로로, 펭귄은 클래스인가? 객체인가?
위 질문에서 클래스와 객체를 구분하는 간단한 방법은 '나이를 물어보는 것'이다.
Q. 사람, 김연아, 뽀로로, 펭귄의 나이는 몇 살인가?
A. 사람과 펭귄은 클래스다. 김연아와 뽀로로는 객체다.
- 클래스와 객체의 관계는 분류(class)와 사물(object)의 관계라고 볼 수 있다.
- 예) 클래스:객체 = 펭귄:뽀로로 = 사람:김연아
4. 추상화: 모델링
추상화는 모델링이다
- 객체 지향의 4대 특성은 클래스를 통해 구현되거나, 객체라고 할 수 있다.
- 객체(object): 세상에 존재하는 유일무이한 사물. 클래스의 인스턴스(instance)
- 클래스: 분류, 집합. 같은 속성과 기능을 가진 객체를 총칭하는 개념
- 애플리케이션 경계: 컨텍스트(Context)라고도 부름.
- "내가 창조하려는 세상은 어떤 세상인가?"
- "내가 만들고자 하는 애플리케이션은 어디에서 사용될 것인가?"
- 추상화: 구체적인 것을 분해해서 관심 영역(애플리케이션 경계, Application Boundary)에 있는 특성만 가지고 재조합하는 것 = 모델링
중요한 부분
- OOP의 추상화는 모델링이다.
- 클래스:객체 = 펭귄:뽀로로
- 클래스 설계에서 추상화가 사용된다.
- 클래스 설계를 위해서는 애플리케이션 경계부터 정해야 한다.
- 객체 지향에서 추상화의 결과는 클래스다.
추상화 = 모델링 = 자바의 class 키워드
클래스 객체_참조_변수 = new 클래스();
추상화와 T 메모리
- T 메모리의 3대 영역인 스태틱, 스택, 힙이 사용되는 과정이 이해가 되지 않으면 연반추 학습을 통해 꼭 이해한다.
- 스태틱 영역에 올라간 정보는 main() 메서드가 시작되기 전에 올라가서 main() 메서드가 종료된 후에 내려올 정도로 스태틱 영역에 고정되어 있기 때문에 스태틱 영역이라고 한다.
클래스 멤버 vs. 객체 멤버 = static 멤버 vs. 인스턴스 멤버
클래스 설계 | 클래스 멤버 | static | 클래스 멤버 속성 |
클래스 멤버 메서드 | |||
객체 멤버 | 객체 멤버 속성 | ||
객체 멤버 메서드 |
▲ 클래스 멤버 vs. 객체 멤버
- 정적 메서드를 사용하는 경우
- main() 메서드
- main() 메서드의 논리를 함수로 분할해서 사용하는 경우
- 정적 변수에 대한 접근자 메서드(getter)와 설정자 메서드(setter)로 사용하는 용도
이름 | 다른 이름 | 사는 곳(T 메모리) |
static 변수 | 클래스 [멤버] 속성, 정적 변수, 정적 속성, ... | 스태틱 영역 |
인스턴스 변수 | 객체 [멤버] 속성, 객체 변수, ... | 힙 영역 |
local 변수 | 지역 변수 | 스택 영역(스택 프레임 내부) |
5. 상속: 재사용 + 확장
- 객체 지향에서의 상속: 상위 클래스의 특성을 하위 클래스에서 상속(특성 상속)하고, 필요한 특성을 추가(확장)해서 사용할 수 있다는 의미
- '부모 클래스-자식 클래스'라는 표현보다는 '상위 클래스-하위 클래스' 또는 '슈퍼 클래스-서브 클래스'라고 표현하자.
상속 관계에서 반드시 만족해야 할 문장
- 하위 클래스는 상위 클래스다.
- 조직도 예) 아버지는 할아버지다(X) / 아들은 아버지다(X) / 딸은 아버지다(X)
- 분류도 예) 포유류는 동물이다(O) / 고래는 포유류다(O) / 고래는 동물이다(O)
자바 언어에서 inheritance라는 키워드 대신 extends(확장)이 존재한다.
상속은 is a 관계를 만족해야 한다?
is a 관계의 완벽한 표현
하위 클래스 is a 상위 클래스
- is a 관계는 객체(클래스의 인스턴스)와 클래스의 관계로 오해의 소지가 있다.
- 예) 객체 is a 클래스
- 김연아 is a 사람 → 김연아는 한 명의 사람이다.
- 뽀로로 is a 펭귄 → 뽀로로는 한 마리 펭귄이다.
- 예) 객체 is a 클래스
- 상속 관계의 명확한 표현은 is a kind of 관계다.
- 예) 하위 클래스 is a kind of 상위 클래스
- 펭귄 is a kind of 조류 → 펭귄은 조류의 한 분류다.
- 펭귄 is a kind of 동물 → 펭귄은 동물의 한 분류다.
- 예) 하위 클래스 is a kind of 상위 클래스
- 객체 지향의 상속은 상위 클래스의 특성을 재사용하는 것이다.
- 객체 지향의 상속은 상위 클래스의 특성을 확장하는 것이다.
- 객체 지향의 상속은 is a kind of 관계를 만족해야 한다.
다중 상속과 자바
인터페이스는 상속과는 다르게 쓰는 것이 유용하다.
- 상속 관계: 하위 클래스 is a kind of 상위 클래스
- 해석: 하위 클래스는 상위 클래스의 한 부류다.
- 예제: 고래는 동물의 한 부류다.
- 인터페이스: 구현 클래스 is able to 인터페이스
- 해석: 구현 클래스는 인터페이스할 수 있다.
- 예제: 고래는 헤엄칠 수 있다.
상위 클래스는 하위 클래스에게 특성(속성과 메소드)을 상속해 주고, 인터페이스는 클래스가 '무엇을 할 수 있다'라고 하는 기능을 구현하도록 강제한다.
Q. 상위 클래스는 하위 클래스에게 물려줄 특성이 많을수록 좋을까? 적을수록 좋을까?
A. 상위 클래스는 물려줄 특성이 풍성할수록 좋다. (LSP: 리스코프 치환 원칙)
Q. 인터페이스는 구현을 강제할 메서드가 많을수록 좋을까? 적을수록 좋을까?
A. 인터페이스는 구현을 강제할 메서드의 개수가 적을수록 좋다. (ISP: 인터페이스 분할 원칙)
6. 다형성: 사용편의성
오버라이딩? 오버로딩?
- 오버라이딩(overriding): 같은 메서드 이름. 같은 인자 목록으로 상위 클래스의 메서드를 재정의
- 오버로딩(overloading): 같은 메서드 이름. 다른 인자 목록으로 다수의 메서드를 중복 정의
오버라이딩과 오버로딩 구분
- ride: 올라타다
- load: 적재하다
오버로딩은 함수명 하나를 가지고 인자 목록만 달리하면 되니 사용하기 편하다. 오버라이딩은 하위 클래스가 재정의한 메서드를 알아서 후출함으로써 형변환이나 instanceof 연산자를 써서 하위 클래스가 무엇인지 신경 쓰지 않아도 된다.
7. 캡슐화: 정보 은닉
객체 멤버의 접근 제어자
- 정보 은닉(information hiding)이라고 하면 접근 제어자인 private, [default], protected, public이 생각날 것이다.
- 습관적으로 private 아니면 public만 사용하거나, 아무 표시도 하지 않는 [default]만 사용해 왔다면 반성이 필요하다.
- 상속을 받지 않았다면 객체 멤버는 객체를 생성한 후 객체 참조 변수를 이용해 접근해야 한다.
- 정적 멤버는 클래스명.정적멤버 형식으로 접근하는 것을 권장한다.
- 일관된 형식으로 접근하기 위해서 정적 멤버인 경우 클래스명.정적멤버 형식으로 접근해야 한다.
- 객체를 생성한 경우에는 객체참조변수명.정적멤버 형태로 접근할 수 있다.
참조 변수의 복사
- Call By Value와 Call By Reference는 본질적으로 차이가 없다. 변수를 복사하는 참조 변수를 복사하든 변수가 가진 값이 그대로 복사되기 때문이다.
- 차이점: 기본 자료형 변수는 저장하고 있는 값을 그 값 자체로 해석하지만, 객체 참조 변수는 저장하고 있는 값을 주소로 해석한다.
- 기본 자료형 변수는 값을 값 자체로 판단한다.
- 참조 자료형 변수는 값을 주소, 즉 포인터로 판단한다.
- 기본 자료형 변수를 복사할 때, 참조 자료형 변수를 복사할 때 일어나는 일은 같다. 즉, 가지고 있는 값을 그대로 복사해서 넘겨 준다.
이 글은 『스프링 입문을 위한 자바 객체 지향의 원리와 이해』 책을 학습한 내용을 정리한 것입니다.
'프로그래밍 > 객체지향' 카테고리의 다른 글
[스터디6] 05. 객체 지향 설계 5원칙 - SOLID (0) | 2025.03.29 |
---|---|
[스터디6] 04. 자바가 확장한 객체 지향 (0) | 2025.03.22 |
[스터디6] 02. 자바와 절차적/구조적 프로그래밍 (1) | 2025.03.07 |
[스터디6] 01. 사람을 사랑한 기술 (0) | 2025.03.01 |
[스터디2] 11. 테스트와 설계 (0) | 2025.02.22 |
Comments