객체지향의 특징
1) 상속 - 기존 클래스 확장
2) 캡슐화 - 보호,은닉
3) 다형성 - 매개변수의 다형성, 하나의 배열에 여러 종류의 객체를 다룰 수 있다.
클래스간의 관계 - 상속관계, 포함관계
6. 상속 : 기존의 클래스로 새로운 클래스를 작성하는 것
- 두 클래스를 조상과 자손으로 관계를 맺어주는 것
- 자손은 조상의 모든 멤버를 상속받는다.
- 자손의 멤버변수는 조상보다 적을 수 없다. ( 멤버개수 : 자손 > 조상)
- 공통적인 부분은 조상에서 수정, 개별적인 부분은 자손에서 수정한다.
포함 : 한 클래스의 멤버변수로 다른 클래스를 선언하는 것 → 복잡도 ↓, 재사용성↑
자바는 다중상속이 안되기 때문에 비중이 높은 클래스 하나만 상속관계로, 나머지는 포함관계로 한다.
Object 클래스 : 모든 클래스의 최상위 클래스
- 조상이 없는 클래스는 자동으로 Object 클래스를 상속받는다.
오버라이딩
- 상속받은 메서드의 내용을 변경하는 것
오버라이딩의 조건
1) 선언부가 같아야 한다.
2) 접근제어자를 좁은 범위로 변경할 수 없다.
3) 조상클래스의 메서드보다 만은 수의 예외를 선언할 수 없다.
오버로딩과 오버라이딩의 차이점
오버로딩 : 기존에 없는 새로운 메서드를 정의하는 것 (new)
오버라이딩 : 상속받은 메서드의 내용을 변경하는 것 (change)
참조변수 super와 this
super : 조상의 멤버와 자신의 멤버를 구분하는데 사용한다.
this : iv(인스턴스변수)와 lv(지역변수)를 구별하는데 사용한다. → 객체 자신을 가르키는 참조변수
super() - 조상의 생성자
자손클래스의 인스턴스를 생성하면 조상+자손의 멤버가 합쳐진 하나의 인스턴스가 생성된다.
자손의 생성자의 첫 문장에서 조상의 생성자를 호출해야 한다. (조상 멤버 초기화)
제어자
- 제어자(캡슐화) : 클래스, 변수, 메서드의 선언부에 선언되며 부가적인 의미를 부여한다.
접근제어자 : public , protected, default, private
그 외 : static, final, abstract, native, ....
static 제어자
static 멤버변수 : 모든 인스턴스에 공통적으로 사용되는 클래스변수
인스턴스를 생성하지 않고 사용 가능하다.
static 메서드 : 인스턴스를 생성하지 않고 호출할 수 있다.
인스턴스 멤버들을 직접 사용할 수 있다.
final 제어자
- 마지막의, 변경될 수 없는, 의미를 가지고 있다.
final의 사용
변수 : 값을 변경할 수 없는 상수가 된다.
메서드 : 오버라이딩을 할 수 없는 메서드가 된다.
클래스 : 확장할 수 없는, 변경될 수 없는 클래스 → 다른 클래스의 조상이 될 수 없다.
접근제어자
- 해당하는 멤버 또는 클래스를 외부에서 접근하지 못하도록 제한하는 역할을 한다.
접근제어자 사용 이유
1) 데이터를 외부로부터 보호하기 위해 사용한다.
2) 불필요한 부분을 감추기 위해 사용한다.
→ 접근하려면 메소드를 통해서 접근 가능하다.
생성자의 접근제어자 (싱글톤패턴)
-생성자에 접근제어자를 사용하면 인스턴스 생성을 제한할 수 있다.
-생성자에 접근제어자를 private로 지정하면, 외부에서 생성자에 접근할 수 없다.
→ 인스턴스를 생성해서 반해주는 public메서드로 외부에서 이 클래스의 인스턴스를 사용가능
→ 생성자가 private면 다른 곳에서 접근할 수 없기 때문에 다른 클래스의 조상이 될 수 없다.
다형성
- 하나의 참조변수로 여러 타입의 객체를 참조할 수 있는 것 → 조상의 참조변수로 자손의 객체를 다루는 것
- 단, 자손 -> 조상은 참조할 수없다. (많은 기능으로 적은 기능을 사용하는 것은 불가능하다)
참조변수의 형변환
- 기본형 변수와 같이 참조변수도 형변환이 가능하다.
- 단, 서로 상속관계에 있는 클래스사이에서만 가능하다.
→ 형변환 : 참조변수의 타입을 변환, 참조할 수 있는 인스턴스에서 사용할 수 있는 멤버의 범위를 조절한다.
instanceof 연산자
-인스턴스의 실제 타입을 체크하는데 사용한다. (리모콘이 실제로 가르키는 것이 어떤 것인지 확인)
1) 실제타입체크
2) 형변환가능여부
→ 연산결과가 true면 해당 타입으로 형변환이 가능하다.
참조변수와 인스턴스변수의 연결 (예제 p.364)
- 멤버변수가 중복정의된 경우, 참조변수의 타입에 따라 연결되는 멤버변수가 달라진다 → 참조변수타입에 영향 받음
- 메소드가 중복정의된 경우, 참조변수의 타입에 관계없이 항상 실제 인스턴스의 타입에 정의된 메서드가 호출된다.
→ 참조변수타입에 영향받지않음.
매개변수의 다형성(예제 p367)
-참조형 매개변수는 메서드 호출시, 자신과 같은 타입 또는 자손타입의 인스턴스를 줄 수 있다.
여러 종류의 객체를 배열로 다루기 (예제 p370)
추상클래스
- '미완성설계도' , 추상메서드를 포함하고 있는 클래스
- 다른클래스를 작성하는데 도움을 줄 목적으로 작성된다
- 인스턴스를 생성할 수 없다. (객체가 만들어진 후 사용가능하다)
추상메서드
- 선언부만 있고 구현부가 없는 메서드
- 반드시 필요하지만 자손마다 다르게 구현해야 할 것으로 예상되는 경우에 사용한다.
- 추상메서드를 상속받는 자손클래스에서 구현부를 완성해야한다. (상속받는곳에서 구현부를 완성)
작성예제
→ 여러 클래스에 공통적으로 사용될 수 있는 추상클래스를 바로 작성하거나 기존클래스의 공통 부분을 뽑아서 추상클래스를 작성한다.
※주의사항
- 추상메서드가 2개인데 1개만 정의했을 경우 클래스 앞에 abstract를 붙혀야 한다.
인터페이스
- 추상메서드의 집합 , (알맹이 업는 껍데기)
- 규칙에 맞게 구현하도록 표준을 제시하는데 사용된다.
- 모든 멤버변수는 public static final, 모든 메서드는 public abstract 이어야 하며, 생략가능하다. (항상 그렇기 때문)
인터페이스의 상속
- 인터페이스도 클래스처럼 상속이 가능하며 클래스와 달리 다중상속을 허용한다.
- Object클래스와 같은 최고 조상이 없다.
인터페이스의 구현
-인터페이스에 구현된 추상메서드를 완성하는 것. → 선언부만 있는 추상메서드의 구현부를 작성한다.
-인터페이스를 구현하는 것은 클래스를 상속받는 것과 같다. 다만 'extends'대신 'implements'를 사용
-상속과 구현이 동시에 가능하다
--예제7-24 p383--
인터페이스 - 다형성
-인터페이스 타입의 변수로 인터페이스를 구현한 클래스의 인스턴스를 참조할 수 있다.
-인터페이스를 메서드의 매개변수의 타입으로 지정할 수 있다.
-인터페이스를 메서드의 리턴타입으로 지정할 수 있다.
--예제7-25 p388--
인터페이스의 장점
1) 개발시간을 단축할 수 있다.
2) 표준화가 가능하다.
3) 서로 관계없는 클래스들에게 관계를 맺어줄 수 있다.
4) 독립적인 프로그래밍이 가능하다.
인터페이스의 이해
-두 대상(객체) 간의 '연결,대화,소통'을 돕는 '중간 역할'을 한다.
-선언(설계)와 구현을 분리시키는 것을 가능하게 한다.
→ A-B의 관계(강결합)를 // A-I-B의 관계로 만들어서 인터페이스 변경하기 용이하게 만든다. (느슨한 결합)
+내부클래스
'프로그래밍 > Java' 카테고리의 다른 글
8. java.lang패키지와 유용한클래스 (0) | 2018.05.07 |
---|---|
7. 예외처리 (0) | 2018.05.07 |
5. 객체지향개념 (0) | 2018.05.01 |
4. 배열 (0) | 2018.05.01 |
3. 조건문과 반복문 (0) | 2018.05.01 |