본문 바로가기
IT/JAVA

JAVA - 객체 지향 심화 1) 상속

by 삐약 개발자 2024. 11. 27.
반응형

상속

기존의 클래스를 재활용하려 새로운 클래스를 작성하는 자바의 문법

부모 클래스(슈퍼 클래스 - 나보다 상위에 있는 클래스)안에 있는것들을 자식클래스가 상속받아 사용가능한것 (필드, 메서드)

"~클래스로부터 상속받았다"라는 표현보다는 "~클래스로부터 확장되었다"는 표현이 그 역할과 기능을 생각했을 때 더 적절한 표현임

두 클래스 간 상속 관계를 설정할 때 사용하는 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