상속
기존의 클래스를 재활용하려 새로운 클래스를 작성하는 자바의 문법
부모 클래스(슈퍼 클래스 - 나보다 상위에 있는 클래스)안에 있는것들을 자식클래스가 상속받아 사용가능한것 (필드, 메서드)
"~클래스로부터 상속받았다"라는 표현보다는 "~클래스로부터 확장되었다"는 표현이 그 역할과 기능을 생각했을 때 더 적절한 표현임
두 클래스 간 상속 관계를 설정할 때 사용하는 extends 키워드 자체가 "확장하다"라는 의미를 가짐
보통 겹치는 것들을 부모에게 받아와서 사용하는 것!
★자바의 객체지향 프로그래밍에서는 단일 상속(single inheritance)만을 허용한다는 것 ★
즉 다중 속성을 허용하지 않는다는것
포함관계
상속처럼 클래스를 재사용할수 있는 방법으로 클래스의 멤버로 다른 클래스 타입의 참조변수를 선언함
필드타입에 다른 클래스 넣어서 사용가능
아래 코드에서 -- Adress 에 의존하고 있다 -- 라고 표현함
public class Employee {
int id;
String name;
Address address;
public Employee(int id, String name, Address address) {
this.id = id;
this.name = name;
this.address = address;
}
void showInfo() {
System.out.println(id + " " + name);
System.out.println(address.city+ " " + address.country);
}
public static void main(String[] args) {
Address address1 = new Address("서울", "한국");
Address address2 = new Address("도쿄", "일본");
Employee e = new Employee(1, "김코딩", address1);
Employee e2 = new Employee(2, "박해커", address2);
e.showInfo();
e2.showInfo();
}
}
class Address {
String city, country;
public Address(String city, String country) {
this.city = city;
this.country = country;
}
}
// 출력값
1 김코딩
서울 한국
2 박해커
도쿄 일본
메서드 오버라이딩★
상위 클래스로부터 상속받은 메서드와 동일한 이름의 메서드를 재정의하는것
즉 덮어쓴다 라는 의미를 가지고 있음
상속받은 메서드에 기능을 바꿀때 사용!
@에너테이션
단 시그니쳐가 하나도 달라지면 안됨! - 본문만 바뀔수 있음
오버로딩은 하나의 메서드를 다양하게 오버라이딩은 메서드를 재정의 하기 위하여!!
둘의 차이점을 명확하게 알고 있어야 함
super 키워드와 super() - 혼자 코드 만들어보기
this는 나 자신
super 는 상속받고 있는 클래스
this() 나자신의 생성자를 가지고옴
super() 나에게 상속하고 있는 super 클래스의 생성자 가지고 옴
그럼 둘다 맨 위에 사용해야 하는가!?
B클래스가 상속받고 있는 A 클래스안에 생성자 안에 필드 name 과 age 를 this 로 받고 싶음
그때 B클래스는 그냥 생성자에 받을수 없음
이럴때 super(name,age) 로 사용해야 생성자 안에서 사용가능함
단 B클래스도 생성자 안에 파라미터에 포함을 시켜줘야 함.
★클래스의 정점, Object 클래스★
모든 클래스는 Object 상속받고 있음
Object 클래스는 최상위에 위치한 상위클래스
즉 자바의 모든 클래스는 Object 클래스로부터 확장합니다.
class ParentEx { // 컴파일러가 "extends Object" 자동 추가
}
class ChildEx extends ParentEx {
}
정말 필요할때만 사용!!
예를들어 자바스크립에서 쓰는 방법으로 배열을 사용하고 싶다면?
Object[] arr = new Object[]{1, true, false, new int[]{1,3,5}, null, new Person{"이정민", 20}};
사용하면 안되는 코드이긴 하지만 가능하다~ 라는 느낌!!
int[] arr = new int[]{1,3,5};
System.out.println(arr.toString()); // 주소값 나옴
System.out.println(Arrays.toString(arr)); // [1,3,5];
그래서 왜 다른 건지???
1. arr.toString() - Object의 기본 toString(), 메모리 주소 반환
배열 객체에서 toString()을 호출하면 기본적으로 Object 클래스의 toString() 메서드가 실행
Object 클래스의 toString() 기본 구현은 객체의 클래스 이름과 메모리 주소를 문자열로 반환
2. Arrays.toString(arr) - 배열의 내용을 문자열로 반환
Arrays.toString()은 java.util.Arrays 클래스의 메서드로, 배열의 내용을 보기 쉽게 문자열로 변환
내부적으로 배열의 모든 요소를 순회하며, 각 요소를 문자열로 만들어 반환
메서드명 | 반환 타입 | 주요 내용 |
toString() | String | 객체 정보를 문자열로 출력 |
equals(Object obj) | boolean | 등가 비교 연산(==)과 동일하게 스택 메모리값을 비교 |
hashCode() | int | 객체의 위치정보 관련. Hashtable 또는 HashMap에서 동일 객체여부 판단 |
wait() | void | 현재 스레드 일시정지 |
notify() | void | 일시정지 중인 스레드 재동작 |
'IT > JAVA' 카테고리의 다른 글
JAVA - 객체 지향 심화 3) 추상화 (0) | 2024.11.27 |
---|---|
JAVA - 객체 지향 심화 2) 캡슐화 (0) | 2024.11.27 |
JAVA - 객체지향 심화 (0) | 2024.11.27 |
JAVA - 내부 클래스 (0) | 2024.11.27 |
JAVA - 생성자(Constructor) (1) | 2024.11.26 |