일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 외부키
- Query
- 참조키
- MySQL
- 서브쿼리
- 검색
- WeNews
- 커밋메세지수정
- subquery
- 컨테이너실행
- appspec.yml
- foreignkey
- docker명령어
- 네이티브쿼리
- 적용우선순위
- 테스트
- 포트
- EC2
- ㅔㄴ션
- 테스트메소드
- ubuntu
- appspec
- 2 > /dev/null
- 예약
- querydsl
- 메소드명
- 메세지수정
- 추후정리
- application.yml
- AuthenticationEntryPoint
- Today
- Total
제뉴어리의 모든것
[Section1][Java] 객체지향 프로그래밍 심화 - 객체 지향의 4가지 핵심 + 상속에 대하여 본문
객체 지향의 4가지 핵심
- 상속
- 캡슐화
- 다형성
- 추상화
- 상속에 대하여 -
상속 (확장)
하위 클래스가 상위 클래스의 모든것(멤버)을 내려받아 재사용 가능한것.
상속의 장점
상속을 사용하면 하위클래스들이 가져야할 공통적인 사항들을 반복적으로 작성하지 않아도 되므로,
코드중복을 방지하여 주고 다형성을 가능하게 해줌.
(java에서의 다형성 : 하나의 변수가 여러 종류의 객체를 다룰수 있음)
- 상세설명
만약 SportsCar 클래스를 만들고 싶다 가정하자.
스포츠카의 속성은 컬러, 모델명, 엔진, 차문의 갯수, 최대 부스터 레벨 정도 있다고 치자.
그리고 이번엔 Truck을 만들고 싶다.
그럴 경우에 속성은 무엇이 있을 수 있을까
여전히 컬러, 모델명, 엔진, 차문의 갯수 정도 있고 적재함의 용량 정도 있다고 치자.
위에서 보았듯이 스포츠카, 트럭 클래스를 만들때 공통적인 속성들이 있다.
컬러, 모델명, 엔진, 차문의 갯수이다.
이런 경우 스포츠카와 트럭의 상위 클래스로 Car라는 클래스를 만들어 공통된 속성들을 빼주면,
앞으로 SportsCar, Truck 그리고 이외의 여러 차종의 클래스를 생성할때
반복적으로 공통속성을 만들어 주지 않아도 된다.
이러한 점은 메소드 또한 동일하다
그리고 Car 클래스를 상속받은 여러 차종의 클래스들은 공통적으로 주행하다(Drive)라는 메소드가 존재할것이다.
그러나 각기 차종에 따라 엔진도 다르고 속력도 다르기에 주행하는 루틴이 다를것이다.
그럴 경우 Car를 상속받은 클래스들마다 해당 메소드를 재정의(오버라이딩) 하여 사용가능하다.
상속의 단점
1. 상위클래스의 로직에서 문제가 생겨 수정하였을 경우, 변경사항이 하위클래스에서 어떠한 영향을 미칠지 예상이 힘들다.
2. 하위 클래스는 상속받은 클래스의 모든 멤버들을 무조건 상속받기 때문에 불필요 할수 있는 내용까지도 포함해야 한다.
3. 여러 하위클래스가 생겨나도 그 하위클래스에서 또 여러 갈래로 파생되어 상속이 될 경우
클래스의 구조적 복잡성이 증가될 수 있다.
상속에서 제외되는 대상
1. 상위 클래스의 생성자
2. 상위클래스의 멤버 중 접근제어자가 private인 경우
3. (하위클래스가 상위클래스와 다른 패키지에 존재할때) 접근제어자가 default인 멤버
Java에서 상속의 특징
단일상속만 가능
포함
클래스 안에 다른 클래스를 멤버변수로 두고 있는것
상속과 포함 구분 방법
임의 클래스 A와 B가 있을때
- A는 B이다. (A - 자식, B - 부모)
- B는 A이다. (A - 부모, B - 자식)
- B는 A를 가지고 있다 (B가 A를 포함하고 있음)
- A는 B를 가지고 있다 (A가 B를 포함하고 있음)
위 네가지 중 문맥상 자연스러운것이 임의의 클래스 A, B의 관계를 구분할 수 있다.
메소드 오버라이딩
상위(조상) 클래스의 메소드를 하위(자손) 클래스에서 메소드의 Body(구현부분)를 재정의 해주는것.
다형성의 특징을 잘 나타는 기능
메소드 오버라이딩의 3가지 조건
- 상위 클래스의 정의된 메소드의 선언(시그니처) 부분이 하위클래스에서 정확하게 일치해야한다
재정의는 Body만!! 이라고 기억하자 - 하위클래스에서 재정의 할때, 접근제어자는 상위클래스에서의 접근 범위와 같거나 넓힌순 있어도 좁게 만들 순 없다.
자식은 부모에게 물려받은것을 넓게 쓸순 있어도 자기 혼자 독차지 해선 안된다!! 라고 기억하자 - 예외는 상위 클래스의 메소드보다 많이 선언 할 수 없다.
super, super()
this가 자기 자신의 객체를 가르키고 this()가 자기 자신의 다른 생성자를 가르킨다면
super는 자신의 부모 클래스 객체를 가르키고 super()는 자신의 부모클래스의 생성자를 가르킨다.
super()의 사용 시점
하위 클래스 객체를 생성자를 이용하여 생성할때,
부모클래스의 초기화도 필요한 경우.
하위클래스의 생성자 Body에서만 사용 가능하며, Body부분에서 가장 첫줄에 존재해야한다.
super() 유의사항
클래스에 아무런 생성자도 정의하지 않았을 경우 컴파일러에서 기본 생성자를 추가해 주듯이,
하위클래스 생성자 body에서 상위 클래스의 생성자를 호출하지 않은 경우,
컴파일러가 자동으로 가장 첫줄에 상위클래스의 기본 생성자를 추가해준다.
그런데 상위 클래스에는 이미 기본 생성자가 아닌 생성자가 정의되 있을 경우,
하위클래스 생성자 첫줄에 명시적으로 상위클래스의 생성자를 호출 하지 않은 경우 에러 발생.
(상위클래스에 기본 생성자와 다른 생성자를 이미 정의한 경우, 컴파일러는 super()를 하위클래스 생성자에 자동으로 추가해주지 않는다)
Object 클래스
자바내의 모든 클래스 (개발자가 생성한 클래스 포함) 는 Object를 상속하게 되어 있다.
개발자가 아무런 클래스도 상속하지 않았더라도 컴파일러는 자동으로 extends Object 를 추가 해준다.
대표적인 Object 멤버메서드
메서드명 | 반환 타입 | 주요 내용 |
toString() | String | 객체 정보를 문자열로 출력 |
equals(Object obj) | boolean | 가 비교 연산(==)과 동일하게 스택 메모리값을 비교 |
hashCode() | int | 객체의 위치정보 관련. Hashtable 또는 HashMap에서 동일 객체여부 판단 |
wait() | void | 현재 쓰레드 일시정지 |
notify() | void | 일시정지 중인 쓰레드 재동작 |
'코드스테이츠 > 정리 블로깅' 카테고리의 다른 글
[Section1][Java] 객체지향 프로그래밍 심화 - 다형성에 대하여 (0) | 2022.07.13 |
---|---|
[Section1][Java] 객체지향 프로그래밍 심화 - 캡슐화에 대하여 (0) | 2022.07.13 |
[Section1][Java] 객체지향 프로그래밍 기초 - 2 (0) | 2022.07.08 |
[Section1][Java] 객체지향 프로그래밍 기초 - 1 (0) | 2022.07.07 |
[Section1][JAVA] 기초 - 2 (0) | 2022.07.05 |