혜야의 코딩스토리
객체지향 프로그래밍 II 본문
[상속관계]
1. 기존의 클래스로 새로운 클래스를 작성하는 것. (코드의 재사용)
class 자식클래스 extends 부모클래스 {
// …. } |
2. 두 클래스를 부모와 자식으로 관계를 맺어주는 것.
3. 자손은 조상의 모든 멤버를 상속받는다. (생성자, 초기화 블록 제외)
4.자손의 멤버 개수는 조상보다 적을 수 없다. (같거나 많다.)
class Parent { //부모 멤버 1개
int age;
}
class Child extends Parent { } //자식 멤버 1개
5.자손 클래스의 변경은 조상 클래스에 영향을 미치지 않는다.
class Parents { //부모 멤버 1개
int age;
}
class Child extends Parent { //자식 멤버 2개
void play( ) {
System.out.println(“놀자~”); }
[포함관계]
-클래스의 멤버로 참조변수를 선언하는 것
-작은 단위의 클래스를 만들고, 이 들을 조합해서 클래스를 만든다.
[클래스 간의 관계 설정하기]
상속관계 ‘A는 B이다.(is-a)’
포함관계 ‘A는 B를 가지고 있다.(has-a)’
→ 위처럼 문장으로 바꿔보고 자연스러운 쪽으로 관계 맺기.
→상속은 제약이 많아서 90%는 포함관계를 주로 사용함.
*참조변수의 초기화
MyPoint p; // 선언만 하면 저장공간 생성이 안됨.
MyPoint p = new MyPoint( ); // 참조변수 초기화시 객체 생성까지 꼭 해주기
[단일 상속]
-Java는 단일상속만을 허용한다. (C++은 다중상속 허용)
-다중상속처럼 편리하게 작성하는 방법은?
→ 비중이 높은 클래스 하나만 상속관계로, 나머지는 포함관계로 한다.
[Object클래스 == 모든 클래스의 조상]
-부모가 없는 클래스는 자동적으로 Object 클래스를 상속받게 된다. (컴파일러가 자동 추가)
-모든 클래스는 Object클래스에 정의된 11개의 메서드를 상속받는다.
→ (toString( ), equals(Object obj), hashCode( );, ...
toString( )메서드 -> “클래스 이름@객체의 주소 값” 반환
♣ println(참조변수.toString()) == println(참조변수)
→ 참조변수만 작성해도 동일한 값이 출력된다. (println( )의 기능)
[메서드 오버라이딩]
-상속받은 조상의 메서드를 자신에게 맞게 변경하는 것
[오버라이딩의 조건]
1. 선언부가 조상 클래스의 메서드와 일치해야 한다.
2. 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
3. 예외는 조상 클래스의 메서드보다 많이 선언할 수 없다.
[참조변수 super]
-객체 자신을 가리키는 참조변수. 인스턴스 메서드(생성자)내에만 존재
-조상의 멤버를 자신의 멤버와 구별할 때 사용
(조상멤버 앞에 super를 붙이고 자신멤버에는 앞에this를 붙인다)
[super( )-조상의 생성자]
-조상의 생성자를 호출할 때 사용
-조상의 멤버는 조상의 생성자를 호출해서 초기화
(자식은 자신이 선언한 멤버만 초기화)
-모든 생성자는 첫 줄에 반드시 다른 생성자를 호출해야 한다. (중요)
그렇지 않으면 컴파일러가 생성자의 첫 줄에 super( );를 삽입
→ 클래스 작성 시 기본생성자 작성 필수 (중요)
[패키지 package]
-서로 관련된 클래스의 묶음
-클래스는 클래스파일(*.class), 패키지는 폴더, 하위 패키지는 하위 폴더
-클래스의 실제 이름(full name)은 패키지를 포함.(java.lang.String)
[클래스 패스 classpath]
-클래스 파일(*.class)의 위치를 알려주는 경로(path)
-환경변수 classpath로 관리하며, 경로간의 구분자는 ‘;’를 사용
classpath(환경변수)에 패키지의 루트를 등록해줘야 함.
[import문] ctrl + shift + O(알파벳)
-클래스를 사용할 때 패키지이름을 생략할 수 있다.
-컴파일러에게 클래스가 속한 패키지를 알려준다.
-java.lang패키지의 클래스는 import하지 않고도 사용할 수 있다.
(String, Object, System, Thread…)
[import문의 선언]
-import문을 선언하는 방법은 다음과 같다.
import 패키지명.클래스명; |
or |
import 패키지명.*; ←해당 패키지의 모든 클래스 |
-import문은 컴파일 시에 처리되므로 프로그램의 성능에 영향 없음.
-이름이 같은 클래스가 속한 두 패키지를 import할 때는 클래스 앞에 패키지명 붙여야 함.
[static import문]
-static멤버를 사용할 때 클래스 이름을 생략할 수 있게 해준다.
ex) import static java.lang.Integer.*; // Integer클래스의 모든 static멤버 ( static변수, static메서드)
[제어자 modifier]
-클래스와 클래스의 멤버(멤버 변수, 메서드)에 부가적이니 의미 부여
(명사를 꾸며주는 형용사의 역할)
접근제어자 | 4 中 1 | public, protected, (default), private |
그 외 | static, final, abstract, native, transient, … |
→ 하나의 대상에 여러 제어자를 같이 사용 가능 (단, 접근 제어자는 하나만)
[static : 클래스의, 공통적인]
제어자 | 대상 | 의미 |
static |
멤버변수 | -모든 인스턴스에 공통적으로 사용되는 클래스 변수가 된다. -클래스 변수는 인스턴스를 생성하지 않고도 사용 가능하다. -클래스가 메모리에 로드될 때 생성된다. |
메서드 | -인스턴스를 생성하지 않고도 호출이 가능한 static메서드가 된다. -static메서드 내에서는 인스턴스 멤버들을 직접 사용할 수 없다. |
[final : 마지막의, 변경될 수 없는]
제어자 | 대상 | 의미 |
final | 클래스 | 변경될 수 없는 클래스, 확장될 수 없는 클래스가 된다. 그래서 final로 지정된 클래스는 다른 클래스의 조상이 될 수 없다. |
메서드 | 변경될 수 없는 메서드, final로 지정된 메서드는 오버라이딩을 통해 재정의 될 수 없다. | |
멤버변수 | 변수 앞에 final이 붙으면, 값을 변경할 수 없는 상수가 된다. | |
지역변수 |
[abstract : 추상의, 미완성의]
제어자 | 대상 | 의미 |
abstract | 클래스 | 클래스 내에 추상 메서드가 선언되어 있음을 의미한다. (미완성 클래스-> 미완성 설계도 -> 제품생성 불가 -> 인스턴스 생성불가) |
메서드 | 선언부만 작성하고 구현부는 작성하지 않은 추상 메서드임을 알린다. (미완성 메서드) |
*추상클래스를 상속받아서 완전한 클래스(구상 클래스)를 만든 후에 객체 생성 가능
[접근제어자 access modifier]
private | 같은 클래스 내에서만 접근이 가능하다. |
(default) | 같은 패키지 내에서만 접근이 가능하다. |
protected | 같은 패키지 내에서, 그리고 다른 패키지의 자손클래스에서 접근이 가능. |
public | 접근 제한이 전혀 없다. |
제어자 | 같은 클래 스 | 같은 패키지 | 자손 클래스 | 전체 |
public | O | O | O | O |
protected | O | O | O | |
(default) | O | O | ||
private | O |
[캡슐화와 접근 제어자]
접근 제어자를 사용하는 이유?
1.외부로부터 데이터를 보호하기 위해서(캡슐화)
2.외부에는 불필요한, 내부적으로만 사용되는 부분을 감추기 위해서
[다형성]
→ 조상 타입 참조 변수로 자손 타입 객체를 다루는 것
Tv t = new SmartTv( ); // 타입이 불일치해도 가능하다.
-참조변수 타입과 인스턴스 타입은 보통 일치해야 하지만 일치하지 않을 수도 있다.
-자손 타입의 참조변수로 조상 타입의 객체를 가리킬 수 없다.
[참조변수의 형변환]
-사용할 수 있는 멤버의 개수를 조절하는 것 (리모콘을 변경하는 것)
-조상, 자손 관계의 참조변수는 서로 형변환 가능
-참조변수의 형변환 시, 실제 객체가 무엇인지가 중요함,
-> 실제 객체보다 참조변수의 멤버가 더 많다면 에러가 발생할 수 있음.
[instanceof 연산자]
-참조변수의 형변환 가능여부 확인에 사용, 가능하면 true 반환
-형변환 전에 반드시 instanceof로 확인해야 함.
Q. 참조변수의 형변환은 왜 하나요?
A. 참조변수(리모콘)를 변경함으로써 사용할 수 있는 멤버의 개수를 조절하기 위해서
Q. instanceof연산자는 언제 사용하나요?
A. 참조변수를 형변환하기 전에 형변환 가능여부를 확인할 때
[다형성 정리]
① Tv t = new SmartTv( ); //조상의 참조변수로 자손의 객체 다루기
② 참조변수의 형변환 : 리모콘 바꾸기 → 사용가능한 멤버의 개수를 조절
③ instanceof연산자 : 참조변수의 형변환 가능여부 확인
[다형성의 장점]
① 다형적 매개변수 : 상속받는 클래스가 늘어나면 오버로딩해야 하는 메서드가 늘어나는 경우 발생
→ 매개변수에 조상타입을 쓰고, 다형성을 사용하여 메서드를 하나로 단축 가능
② 하나의 배열로 여러 종류 객체 다루기 가능
[매개변수의 다형성]
-참조형 매개변수는 메서드 호출 시, 자신과 같은 타입 또는 자손타입의 인스턴스를 넘겨줄 수 있다.
[여러 종류의 객체를 배열로 다루기]
-조상타입의 배열에 자손타입 객체를 담을 수 있다.
'꿈 : 멋진 개발자 🧸 > 자바의 정석' 카테고리의 다른 글
[자바의 정석] 객체지향개념 수기 정리 :) (2) | 2022.05.08 |
---|---|
추상 클래스 & 인터페이스 (0) | 2022.05.06 |
객체지향 프로그래밍 I (0) | 2022.05.02 |
Method 메서드 (0) | 2022.04.29 |
배열 (0) | 2022.04.29 |