Java

클래스, 상속

최종군 2024. 7. 6. 17:13

 

객체지향 프로그래밍이란? 현실 세계의 객체들간의 상호작용을 프로그래밍을 통해 

가상세계로 구현하는 과정이다 

객체들을 만들기 위해서 class라는 객체를 만들기위한 틀이 필요하다 

 

객체란 현실세계에 독립적으로 존재하는 모든 것들을 의미한다 

현실 세계에서는 객체들간의 상호작용으로 돌아간다

 

클래스 구조 :

 [접근제한자] [예약어] class 클래스명 {

// 필드부 : 변수 - (데이터를 저장하는 공간)

[접근제한자][예약어] 자료형 변수명[= 값]

 

// 생성자부 

접근제한자 클래스명([매개변수 정보]){}

- 생성자는 반환타입을 명시하지 않는다. 

즉 void도 반환타입이 없다는 뜻이므로 

생략한다 

 

// 메소드부(기능을 실행하는 부분) : 

[접근제한자][예약어]반환타입 메소드명(매개변수정보){}

메소드명은 소문자로 시작한다

 

Java에서는 객체로 만들기 위해서는 

[new] 키워드를 사용하여 heap 영역에 생성을 먼저해야한다

- 즉 공간 할당을 해야된다 .

 

캡슐화 : 추상화를 통해서 정의된 속성들과 기능들을 하나로 묶어 관리하는 기법이다 

데이터의 직접 접근을 제한하고 * (직접 접근 제한이란 정보 은닉을 얘기한다)

간접 접근하여 메소드로 처리하는 방법을 말한다 

 

 * 정보은닉 : [ private ] 접근 제한자를 사용하여 데이터에 직접 접근을 제한함

 

 * [ getter/setter ] 메소드 : 외부에서 직접 접근이 제한된 데이터에 간접적으로 접근할 수 있도록 하는 방법

 

public String getTitle() {
    return title; // 해당 필드에 담긴 값을 반환해주는 메소드이다
}

public void setTitle(String title) {
    this.title = title; // 해당 필드에 대입하고자 하는 값을
// 전달 받아 해당 필드에 대입 시켜주는 메소드
}

 

 

getter - 

[접근제한자][반환타입][메소드명][()]{

return [반환 시킬 변수명]

}

 

setter - 

[접근제한자][반환타입 void][메소드명](매개변수 정보){

this.title = title 

}

 

- 생성자 :

 

+ 기본 생성자 : 단지[객체 생성]만을 목적으로 할 때 사용한다

매개변수 정보가 없는 생성자이다

생략했을 경우 JVM이 자동으로 만들어주기 때문에 객체 생성 가능하다 

 

+ 매개변수 생성자 : 객체 생성과 동시에 전달값들을 매개변수로 받아서 

해당 각 필드에 초기화할 목적으로 사용한다 

 

중복되는 동일한 내용의 생성자가 존재하는 경우[this()] 생성자를 활용 가능하다 

=> 같은 클래스 내에 생성자에서 또다른 생성자를 호출하고자 할 때 사용된다

 

# 생성자 작성 시 주의사항 

 

1. 반드시 생성자명은 [클래스명]과 동일해야한다(대소문자 구분된다)

2.반환타입이 존재하지 않는다 - 반환타입 작성 시 메소드로 인식된다 

3.매개변수 생성자를 명시적으로 작성하게 되면 jvm이 기본생성자를 자동으로 

만들어주지 않는다 

 

메소드 오버로딩 : 

한 클래스 내에 [같은] 메소드명으로 여러 개를 정의할 수 있는 방법이다 

# 조건

- 메소드명이 같아야한다 

- 매개변수 정보가 달라야 한다(개수/순서/종류)

 


 

상속 :

클래스가 가지고 있는 "멤버들(변수/메소드)"를 다른 클래스에서 직접 만들지 않고

상속 받음으로써 자신의"멤버(변수/메소드)"처럼 사용할 수 있는 기능 

 

- 특징 : 

모든 클래스는 Object 클래스의 후손이다 

부모클래스의 생성자, 초기화 블록은 상속되지 않는다

- 부모 클래스에 정의되어 있는 "protected"필드는 자식 클래스에서

직접 접근이 가능하다  

- 부모의 private 멤버는 상속은 되지만 직접 접근이 불가능하다 

 

자식 클래스는 부모클래스에 있는 메소드를 호출 가능하다 

super.메소드명

부모 클래스에 있는 메소드를 자식 클래스에서 

재정의가 가능하다 이걸 오버라이딩이라고 부른다 

 

자바에서는 단일 상속만 지원을 한다 

자식 클래스에서 부모클래스의 생성자를 호출할 때 "super(인자값)"를 사용한다

 

예시 

public class Green extends Member {

 

public Green(String name, String phone, String address) {
super(name, phone, address);
}

 

자식 클래스에서 부모클래스의 멤버(변수/메소드)에 접근할 때 super.변수명/메소드를 사용한다 

 

[접근제한자] class 클래스명(자식) extends 클래스명(부모) {

 

 

*오바라이딩 : 

자식클래스가 상속 받고 있는 부모클래스의 메소드를 재정의하는 것이다 

자식객체를 통해 실행 시 자식 메소드가 우선권을 가진다

성립 조건 : 

메소드명이 동일해야한다 

부모메소드의 "*반환 타입이 동일"해야한다

부모메소드의 접근제한자보다 자식 메소드 접근제한자 :  범위가 같거나 커야된다.   

 

 ex) 부모메소드의 접근제한자가 protected인 경우 오버라이딩되는

메소드의 접근제한자는 protected, public!다

 

상속 구조에서의 클래스 간 형변환 :

 

업캐스팅 : 

"자식/하위/후손" 클래스 타입 -> "부모/상위/조상" 클래스타입

 

자동형변환이 된다 

Parent p = /* (Parent) */ new Child();

Parent p =  new Child();

 

다운캐스팅 

: "부모/상위/조상" 클래스 타입 -> "자식/하위/후손" 클래스 타입

강제 형변환 : 

((Child)p).childMethod();

 

다형성 : 

"부모클래스"타입으로 파생된 여러가지 타입의 "자식" 객체들을 

"부모"클래스 타입 하나로 다룰 수 있는 기술 

 

- 장점

부모 타입의 배열로 "여러 개의" 자식 객체들을 다룰 수 있다 

메소드 정의 시 "매개변수"로 다형성을 적용하게 되면 메소드 갯수가 줄어든다 

info(Box box) {

info(new Box())

} info(new PaperBox())

 

 

- 동적바인딩
  : 프로그램 실행 시 동적으로 자식클래스의 "오버라이딩(재정의)" 된 메소드를 찾아서 실행

 

 

인터페이스 : 

- 클래스가 구현해야 할 기능을 [추상] 메소드로 규격을 정의한다 

- 인터페이스 구현 시 [implements] 키워드 사용한다 

표현식 + 접근제한자 예약어 class 클래명 implements 인터페이스명{}

 

모든 필드는 기본적으로  [  public static final  ] 키워드가 적용된다. 

즉 상수가 적용이된다. 

 

추상클래스 

- [추상] 메소드가 포함된 클래스 

- [abstract] 키워드 사용한다 

 

+ 표현식 +

접근제한자 abstract class 클래스명{}