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 클래스의 멤버를 내것처럼 쓰고 싶을 때 사용하는 클래스

'Java' 카테고리의 다른 글
| 자바의 메소드, 모듈화, 클래스에 대해서(Method,Modularization,Class) (2) | 2025.06.28 |
|---|---|
| 자바의 배열(array)에 대해 배운날 (0) | 2025.06.26 |
| JAVA 반복문, 제어문 (3) | 2025.06.25 |
| 객체지향 언어 자바란 무엇인가. (4) | 2025.06.25 |