✏️ Language/Java

Java 이해하기 ( 객체지향 프로그래밍 2-1 )

안들외드 2022. 8. 10. 17:38

 

클래스 간의 관계(상속, 포함)

 

상속이란?

기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것.

 

 

상속의 장점

1. 코드의 재사용성을 높인다.

2. 코드의 중복을 제거한다.

 

3. 프로그램의 생산성과 유지 보수에 크게 기여한다.

 

 

 

상속 구현하는 방법

형식   =>   class 상속받는클래스이름 extends 상속해주는클래스이름

(extends인 이유는 자손 클래스는 조상 클래스로부터 상속받으면 받을수록 멤버가 점점 확장(extend) 되기 때문에)

 

ex) class Child extends Parent() {

// 필요한 내용 작성

}

 

 

 

 

상속의 특징

자손 클래스는 조상 클래스의 모든 멤버를 상속받는다 ( = 포함한다 )

조상 클래스가 변경되면 자손 클래스는 자동적으로 영향을 받게 된다.

(반대로 자손 클래스가 변경되어도 조상 클래스에는 아무런 영향을 주지 못한다.)

 

자손 클래스는 항상 조상 클래스보다 같거나 많은 멤버를 갖는다.

 

생성자와 초기화 블럭은 상속되지 않는다.
(멤버만 상속된다.)

 

자바에서 형제 관계란 없다.

 

 

 


 

 

포함이란?

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

포함관계를 보여주는 예시

 

 

 

클래스간의 관계 결정하기

 

상속 : ~은 ~이다.

포함: ~은 ~을 가지고 있다.

이렇게 대입해서 말 이 되는 쪽으로 결정할 것

 

 

 

단일 상속이란?

 

조상 클래스로는 하나만 상속받을 수 있다.

(C++에서는 다중 상속이 가능하지만 자바에서는 단일 상속만 가능하다.)

 

 


 

 

오버라이딩
 

 

오버라이딩이란?

조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것.

(내용(구현부)만 변경가능.)

 

 

 

조상 클래스의  메서드를  자손 클래스에서  오버라이딩 할 때(조건)

1. 선언부가 조상 클래스의 메서드와 일치해야 한다.

 

2. 접근제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.

ex) 조상 클래스의 메서드 범위가 public 이면 자손은 public 보다 작은 범위를 사용할 수 없음.

 

3. 예외는 조상 클래스의 메서드보다 많이 선언할 수 없다.

 

4. 인스턴스 메서드를 static 메서드로 또는 그 반대로 변경할 수 없다.

 

 

 

 

오버라이딩 / 오버로딩 구분할 것!!

오버라이딩은 조상의 메서드를 자손의 클래스로 가져와 변경하여 사용하는 것.

 

오버로딩은 기존에 없는 새로운 메서드를 정의하는 것.

 

 

 


 

super 란?

자손 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는 데 사용되는 참조 변수이다.

 

 

 

super()

조상 클래스의 멤버의 초기화 작업이 수행되기 위해서 자손 클래스에서 조상 클래스의 생성자를 호출하는 데 사용하는 것.

(생성자,초기화블럭 은 상속 되지 않기 때문에)

 

모든 생성자의 첫 줄에는 반드시 생성자를 호출해야 하는데 써주지 않을 경우 컴파일러가 자동으로 super(); 를 삽입해 줌.

 

 


 

 

package와 import

 

package란?

  • 클래스의 묶음이다.
  • 클래스의 효율적 관리가 가능하다.

  • 서로 다른 패키지의 존재하는 것이 가능하므로 충돌을 피할 수 있다.

  • 패키지는 점(.)을 구분자로 하여 계층구조를 구성할 수 있다.
    ex) java.lang.String

  • 모든 클래스는 하나의 패키지에 속해야 한다.

  • 패키지는 물리적으로 클래스 파일을 포함하는 하나의 디렉토리이다.

 

 

 

 

package의 선언

형식 => package 패키지명;

(주의!! 패키지 선언문은 반드시 첫 번째 문장이어야 한다.(주석, 공백은 제외)

하나의 소스파일에 단 한번만 선언될 수 있다.)

 


 

import 문

 

import 문을 사용하면 소스코드에 사용되는 클래스 이름에서 패키 지명을 생략할 수 있다.

 

ex)

원래는 이렇게 패키 지명을 붙여주어야 한다. java.util.클래스이름

 

 

그러나 import 문을 사용하면 패키지 명을 붙여주지 않아도 된다.

 

 

 

자바에서는 패키 지명을 자동으로 붙여주는 단축키가 있다. (윈도우 기준)

=> ctrl + shift + o 를 사용하면 자동으로 위치를 찾아서 import문을 추가해 준다.

 

java.lang패키지의 클래스는 import 없이 사용할 수 있다.(기본 패키지(String,System,Object...)이기 때문에)

 

 

 

 

 

 

import 문의 선언

형식=> import 패키지명.클래스명;

import 패키지명.*;

 

package와 클래스 선언 사이에 import 문이 들어간다

package문

import문

클래스 선언

이렇게 순서가 되어있다.

 

한 패키지에서 여러 개의 클래스를 사용하려고 할 때는 일일이 import 문을 지정해 주는 것보다는

import.패키지명.* 이렇게 써주면 된다.

(*을 붙이면 그 패키지에 있는 클래스를 전부다 사용할 수 있다.)

 

 

 


 

제어자

 

 

제어자란?

 

클래스, 변수, 메서드의 선언부에 함께 사용되어 부가적인 의미를 부여한다.

 

하나의 대상에 대해서 여러 제어자를 조합하여 사용하는 것이 가능하다.

 

접근제어자는 한 번에 네 가지 중 하나만 선택해서 사용할 수 있다.

 

 

 

접근 제어자

 

=> public, protected, default(실제로 붙이지 않는다), private

 
제어자
같은 클래스
같은 패키지
자손 클래스
전체
public
O
O
O
O
protected
O
O
O
 
(default)
O O
 
 
private
O      

범위가 넓은 순서

public => 접근 제한이 전혀 없다.

protected => 같은 패키지 내에서, 다른 패키지의 자손 클래스에서 접근이 가능하다.

default => 같은 패키지 내에서 접근이 가능하다.

private => 같은 클래스 내에서만 접근이 가능하다.

 

 
대상
사용 가능한 접근 제어자
클래스
public, (default)
메서드
public, protected, (default), private
멤버변수
지역변수
없 음

 

 

접근 제어자를 사용하는 이유

외부로부터 데이터를 보호하기 위해서

외부에는 불필요한 내부적으로만 사용되는, 부분을 감추기 위해서

= 데이터 감추기, 캡슐화

 

 


 

그 외 제어자

=> static, final, abstract, native, transient, synchronized, volatile, strictfp

 

 

final(마지막의, 변경될 수 없는)

클래스 앞에 붙으면 변경하거나 확장될 수 없는 클래스가 된다.(= 조상이 될 수 없다.)

메서드 앞에 붙으면 변경될 수 없다.(= 오버라이딩 될 수 없다.)

멤버변수,지역변수 앞에 붙으면 값을 변경할 수 없는 상수가 된다.

 

 

 

 

(참고)

보통 멤버변수의 값을 읽는 메서드의 이름을 'get멤버변수이름'

보통 멤버변수의 값을 변경하는 메서드의 이름을 'set멤버변수이름' 으로 한다

겟터셋터라고 부름.