본문 바로가기

자바 has -a, is -a 관계, 추상메서드, 추상클래스

@공공둘둘2025. 7. 3. 00:15

has ~ a : ~가 ~을 가지고 있다.

 A has a B : A클래스는 B클래스를 가지고 있다. 즉 한 클래스가 다른 클래스의 객체를 갖는 관계를 의미한다.

 독립적인 부품으로 설계하여 사용자가 언제든지 재사용이 가능하게, 가져다쓰기 편하게 하는 것이 목표이고, 클래스간의 결합도를 낮춰 유지보수와 확장에 유리하다!

 

is ~ a : 상속 관계를 의미하며, 자바의 OOP 특징 중 하나이다. superclass와 subclass 사이에서 subclass는 superclass이다 라는 관계가 되어야함. 모든 상속이 다 좋은 것만은 아님. 

예시로 '개는 포유류 이다'는 is~a관계를 만족하지만, is like a 처럼 설계해서는 안된다. A는 B와 비슷하다 서브클래스는 수퍼클래스와 비슷한게 아니고, 한 종류여야한다. 모든차는 엔진을 갖듯이 말이다.

 

자바는 100% 상속 구조로 이루어져 있으며 

 

public class Main ( extends Object ) { 

 public static void main(String[] args){

     }

}

일반 클래스도 아무것도 상속받는 것이 아닌 extends Object가 생략 되어있는 것이다.

그래서 우리는 toString()이나  equals()등을 사용할 수 있다.

자바는 다중상속을 허용하지 않으며, 객체끼리는 단일 상속만 가능하다, 인터페이스는 모호성이 발생하지 않아 다중상속(구현)이 가능하다.

 

구분is-a (상속)                                                                                   has-a (포함)

관계 "A는 B의 한 종류이다" (일반화/구체화) "A는 B를 부품으로 가진다" (전체/부분)
키워드 extends 멤버 변수로 다른 클래스 객체 선언
목적 코드 재사용, 다형성 구현 코드 재사용, 유연하고 독립적인 클래스 설계
결합도 높음 (강한 결합) 낮음 (느슨한 결합)
설계 한번 구조가 잡히면 변경이 어려움 부품 교체가 쉬워 유연하고 확장성이 좋음
원칙 명확한 is-a 관계일 때만 사용 "상속보다 포함을 우선하라"

 

항상 결합이 낮을 수록 좋은 설계이다. 유지보수가 용이하기 때문

 

============================================================================================

### 오버라이딩

- : 부모클래스에서 정의된 메서드를 자식클래스에서 자신의 기능의 맞춰 수정하거나 확장할 수 있는데, 메서드 이름, 매개변수, 리턴타입 모두같아야 재정의 할 수 있고, 접근지정자의 변경은 부모클래스의 메서드 접근지정자를 따라가거나 더 넓은 범위로만 변경이 가능하다.

- : 부모 메서드에 final을 붙이면 오버라이딩을 할 수 없다.

- : 오버라이딩을 하면 동적 바인딩이 일어난다.

- : Ex)

SuperClass object = new SubClass();
object.run();

 - : 이때 run()메서드는 수퍼클래스의 run()이 수행될까 아니면 서브클래스의 오버라이딩된 run()메서드가 수행될까?

     답은 서브클래스의 run이 수행된다. 부모 참조 레퍼런스 object는 new 로 생성된 자식객체에 접근하여 자식의 기능을 사용할 수 있다. 원래는 부모클래스는 자식의 메서드는 사용하지 못한다 왜냐하면 상속만했지 재정의된 메서드는 애초에 알지 못하기 때문이다.

 

### super 키워드

- : 자식클래스에서 만약 부모 메서드를 오버라이딩(재정의)하여 사용할 수 없을 때 부모 클래스의 멤버에 접근하기 위해 사용하는 기능이다.

- : super.메서드명() : 부모 클래스의 메서드를 호출

- : super() : 부모클래스의 생성자를 호출, 자식 클래스의 첫줄에서만 사용이 가능하고 명시하지 않아도 항상 적혀있다 다만 생략되어 있을 뿐이다.

 

### 오버로딩

- : 같은 클래스내에 이름이 같은 메서드를 사용할 수 있다. 단 매개변수의 개수나, 타입 등 메서드 끼리 구별할 수 있는 조건이 충족시에만 사용이 가능하다. 

 

 

### 추상클래스
- : 일정부분 구체화가 덜 되어있는 클래스
- : 왜쓰냐 : 메서드 오버라이딩에대한 강제성을 자식들에게 줘야하기 때문에
- : 왜쓰냐 : 부모가 동적바인딩을 해야할 때
- : **객체를 (new)생성할 수 없는 클래스**
- : 추상메소드를 하나이상 가지고 있는 클래스(선언는 있는데 바디는 없음)
- : 얘는 이렇게 만들꺼야라는 느낌

- : 추상메소드
- 함수선언만 되어있는 메소드
- : 상속을 통해서 사용. (100%로는 아님 왜냐하면 익명 내부 클래스 (Anonymous Inner Class는 객체 생성 시에 즉시 구현해버리기 때문에)
- : anonymous inner class를 사용할 때 사용.(자바에서 이벤트처리할 때 가장많이 사용)

- : **추상클래스를 상속받는 서브클래스는 무조건 추상메소드를 오버라이딩해야함**
- 하지 않을 경우 추상클래스화 됨
- : 강제성
- 동적바인딩은 부모가 알고있는 것까지만 접근할 수 있는데 추상메소드를 통해 자식들의 메서드까지 접근이 가능함.3

### 동적바인딩
어느객체를 접근 하든 똑같은 방법으로 접근이 가능(일관된 방법으로 접근)하는게 장점

# 자바에서 인터페이스를 못쓰는 사람은 바보다
인터페이스
- 상수(final)와 추상메서드만 갖을 수 있다. 
- 추상클래스도 있는데 굳이 왜 써야할까?
- 다중상속도 가능하고, 코드를 가독성이 좋고, 강제성을 더 줄 수 도 있구 
- 인터페이스를 받는 객체를 구현객체라고 한다.
- interface 끼리는 상속이 가능하다!
- 오버라이딩을 통한 일관된 접근이 간편하다.
- 강제성, 동적바인딩 등등등 장점인 너무 많당


# inner 클래스
- 안에 있는 클래스 마치 for문안에 for문을 이중for문이라 하듯이
- **static 이너클래스를 제외하고 나머지 이너클래스는 꼭 아우터클래스 먼저 만들고 이너클래스를 만들어야 한다.**
- 종류
- **anonymous innerclass** 익명 내부 클래스
- 이름없이 쓰는, 단발성(일회성)


- **member inner class**
- 클래스 안에 클래스가 있는 것


- static inner class
- 클래스 안에 아무거나 넣으면 되는데 innerclass 앞에 static을 붙인것


- local inner class
- 클래스 안이긴 안인데.  메서드 안에 클래스가 있음

- 잘 사용하지 않음
- 클래스안에 있기 때문에 종속적임, 

 


-- 이벤트 처리를 할 때 굉장히 많이 씀
- 밖에있는 클래스를 아우터 클래스
- outter 클래스의 멤버를 내것처럼 쓰고 싶을 때 사용하는 클래스

 

공공둘둘
@공공둘둘 :: 0022

공감하셨다면 ❤️ 구독도 환영합니다! 🤗

목차