백엔드/JAVA

13일차 수업 기록

두개의 문 2023. 5. 15. 17:21
상속

▶ 클래스 간의 관계 결정하기

 - 클래스를 작성할 때, 두 클래스 간의 관계가 상속관계인지, 포함관계인지 헷갈릴 때가 있음

  → 아래와 같이 문장을 만들어보면 어떤 관계인지 명확해짐
① 상속 관계 : ' ~은 ~이다 ( is - a ) '

② 포함 관계 : ' ~은 ~을 가지고 있다 ( has - a ) '

    → 한 클래스의 멤버변수로 다른 클래스 타입의 참조변수를 선언하는 것을 의미

 

 - 예시

class Circle {
    int x;
    int y;
    int z;
}
class Point {
    int x;
    int y;
}

❶ 상속 관계

class Circle extends Point {
	inr r;
}

 

❷ 포함 관계

class Circle {
	Point p = new Point();
    int r;
}

 

❸ main( ) 메서드 내에서 Circle 객체 생성

Circle c = new Circle();

 

 

▶ 단일 상속 

 - 자바에서 한 클래스가 다중상속, 즉 두 개 이상의 클래스를 상속받을 경우 충돌 에러가 발생함

   예를 들어, 상속받는 두 부모 클래스에 동일한 선언부를 가진 메서드가 있을 경우 

   자식 클래스에서 서로 다른 구현부를 가진 이 메서드를 어떻게 구별할 수 있을까?

  → 이러한 특징 때문에 자바에서는 단일상속만 허용됨

  → 나중에 '인터페이스'를 배우게 되면, 충돌 문제를 해결하면서 다중상속과 같은 효과를 낼 수 있음

  ∴ 현재는 비중이 높은 클래스 하나만 상속받고 나머지는 포함관계로!

 

- 예시 ( Tv 클래스를 상속 받고, DVD 클래스를 포함시켜보자 )

class Tv {
	// 생략
}
class DVD {

	void power(){
    	// 생략
    }
    
    void play(){
    	// 생략
    }
}

 

class TvDVD extends Tv {
    // 포함 - 다른 클래스의 참조변수를 선언
    DVD dvd = new DVD();
    
    // 포함 관계인 클래스의 메서드 추가 -> 참조변수를 통해 해당 클래스의 메서드 호출시키기
    void power() {
    	dvd.power();
    }
    
    void play(){
    	dvd.play();
    }
}

 

- Object 클래스 : 모든 클래스의 조상

  · 모든 클래스 상속계층도의 최상위에 있는 조상클래스

  · 다른 클래스로부터 상속 받지 않는 모든 클래스들은 자동적으로 Object 클래스로부터 상속받게 함

  · 이미 어떤 클래스로부터 상속받도록 작성된 클래스를 제외하고, 나머지 클래스에 대해서는 컴파일러가 'extends Object'를 자동적으로 추가시킴

 

 

패키지

 

▶ package

  · 클래스를 체계적으로 관리하기 위해 사용 → 서로 관련된 클래스와 인터페이스의 묶음

  · 패키지의 물리적인 형태는 파일 시스템의 폴더로, 패키지는 서브패키지를 가질 수 있음 ( 도트연산자 . 로 구분 )

 상위패키지.하위패키지.클래스
ex ) java.lang.String

 

▶ package 선언

  ① package 선언 :  package 패키지명 ;

  ② 위치 : 반드시 소스파일에서 주석과 공백을 제외한 첫 번째 문장이어야 함

  ③ 하나의 소스파일에 단 한 번만 선언될 수 있음

      단, 자바에서는 기본적으로 '이름없는 패키지'를 제공 -> 소스파일 작성 시, 패키지 선언하지 않아도 문제 없음

      ※ 앞으로 프로젝트 작성 시, 미리 패키지를 구성하여 클래스들을 효율적으로 관리해야 함.

 

▶ package 이름 작성 규칙

  - 숫자로 시작 안됨, _, $를 제외한 특수문자 사용 불가

  - java로 시작하는 패키지는 자바 표준 API에서만 사용하므로 사용 불가

  - 클래스명과 쉽게 구분하기 위해서 모두 소문자로 작성

  ※ 패키지 이름의 중복 방지 방법 : 서로 중복되지 않도록 3단계 이상으로 짓자

 

 

import문

 

import문 : 컴파일러에게 소스파일에 사용된 클래스의 패키지에 대한 정보 제공

  - 모든 소스파일에서의 import문의 위치 : package문 다음, class 선언 이전

  

import 상위패키지.하위패키지.클래스이름;
import 상위패키지.하위패키지.*;             
// 사용하고자 하는 클래스들이 동일한 패키지 소속일 경우, 개별 import문보다는 *를 이용해 해당 패키지 내 모든 클래스로 표시

 

 import문 자동 추가 ( 2가지 방법 )

   ① windows의 단축기 : Ctrl + Shift + O

   ② 해당 클래스에서 [ Source ] - [ Organize imports ] 

 

 

접근 제어자

- 접근 제어자의 목적 : 멤버 또는 클래스에 사용 → 해당 멤버 또는 클래스를 외부에서 접근하지 못하도록 제한하는 역할

- 접근 범위가 넓은 쪽에서 좁은 쪽의 순  : public > protected > (default) > private 

 ① public : 접근 제한 없음

 ② protected : 같은 패키지 내 또는 다른 패키지의 자손 클래스에서 접근 가능

 ③ (default) : 같은 패키지 내에서만 접근 가능 → 접근 제어자가 지정되어 있지 않은 경우에 해당

 ④ private : 같은 클래스 내에서만 접근 가능

 

- 접근 제한의 종류와 적용할 대상

접근 제한 적용 대상
public 클래스, 필드, 생성자, 메서드
protected 필드, 생성자, 메서드
( default ) 클래스, 필드, 생성자, 메서드
private 필드, 생성자, 메서드

 

- 직접 접근제어자 설정해서 확인해보자