혜야의 코딩스토리

객체지향 프로그래밍 II 본문

꿈 : 멋진 개발자 🧸/자바의 정석

객체지향 프로그래밍 II

hyeya_ 2022. 5. 6. 22:51

[상속관계]

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(“놀자~”); }

 

[포함관계]

-클래스의 멤버로 참조변수를 선언하는 것

-작은 단위의 클래스를 만들고, 이 들을 조합해서 클래스를 만든다.

 

[클래스 간의 관계 설정하기]

상속관계 ‘AB이다.(is-a)’

포함관계 ‘AB를 가지고 있다.(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