TIL

230201 [Java] (다형성 / 형 변환 / 메소드 오버라이딩 / Object 클래스)

하차모 2023. 2. 1. 16:25

1. 다형성

  부모클래스형으로 자식클래스 객체 생성 가능

  생성된 객체는 부모클래스의 변수와 메소드만 사용 가능

public class Phone {
    int phoneNumber;

    public void sendMsg() {
        System.out.println("문자 전송");
    }
}

class SmartPhone extends Phone {
    String os;

    public void playApp() {
        System.out.println("앱 실행");
    }
}

  +) 상속 가능 여부는 'IS-A' 관계가 충족되어야 함 (EX> Student is a person.)

  +) 한 소스파일 안에 둘 이상의 public class가 올 수 없음

public class PhoneTest1 {
    public static void main(String[] args) {
        Phone p1 = new Phone();
        SmartPhone p2 = new SmartPhone();
        //가능
        Phone p3 = new SmartPhone();

        //오류 -> 자식클래스형으로 부모클래스 객체 생성은 불가함
        //SmartPhone p4 = new Phone();
    }
}

 

2. 형 변환

  다형성을 이용해 생성한 객체는 부모클래스의 변수 및 메소드 밖에 사용할 수 없기 때문에 한계가 있음.

  형 변환을 통해 객체의 자료형을 변경할 수 있고 그로 인해 변수  및 메소드도 다 사용할 수 있다.

Phone p3 = new SmartPhone();
//p3는 phone 클래스의 phoneNumber 변수와 sendMsg만 사용할 수 있다.
SmartPhone s1 = (SmartPhone) p3;
//형 변환 후 s1은 phone 클래스의 변수 및 객체뿐만 아니라 
//SmartPhone 클래스의 os 변수와 playApp 메소드까지 사용할 수 있다.

 

3. 메소드 오버라이딩

  상속 관계에서 메소드 명이 같고 매개변수의 정보도 같을 때 같은 이름으로 메소드를 만들면 자식클래스에서 재정의된 메소드만 호출 가능하다.

  부모클래스의 메소드를 호출할 때는 super.를 사용함

public class Animal {
    public void sound() {
        System.out.println("동물이 웁니다");
    }
}

class Dog extends Animal {
    public void sound() { //오버라이딩
        System.out.println("멍멍");
    }
}

class Cat extends Animal {
    public void sound() { //오버라이딩
        System.out.println("야옹");
    }
}

  +) 상속은 재사용성을 높여줄 뿐만 아니라 연관이 있는 여러 클래스에 공통적인 규약을 줌으로써 일관적으로 관리하는 것을 용이하게 한다.

public class AnimalManage {
    public static void main(String[] args) {
        //강아지, 고양이 저장할 공간 5개
        Animal[] cages = new Animal[5];
        cages[0] = new Cat();
        cages[1] = new Cat();
        cages[2] = new Dog();
        cages[3] = new Dog();
        cages[4] = new Dog();

        for (int i = 0; i < cages.length; i++) {
            cages[i].sound(); //야옹 야옹 야옹 멍멍 멍멍
        }
    }
}

 

4. Object 클래스

  모든 클래스는 Object 클래스를 상속받고 있다!

  클래스를 생성할 때 클래스명 뒤에 extends Object가 항상 생략되어 있다고 생각하면 됨.

  자바에서 제공하는 기본적인 기능을 사용하도록 하기 위함이다

 

Object 클래스에서 상속받은 메소드들..

4-1. toString() : 객체의 정보를 문자열로 리턴해주는 기능

public class Person {
    String name;
    int age;

    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
class PersonTest {
    public static void main(String[] args) {
        Person p1 = new Person("홍길동", 20);
        System.out.println(p1.toString()); //.toString()은 생략 가능
    }
}

  실행 결과 -> Person@4eec7777 (클래스명@16진수의해시코드 형태로 반환해준다.)

  +) 객체명을 출력하면 자동으로 객체명 뒤에 .toString()이 붙어서 실행됨

  보통 오버라이딩해서 객체가 가지고 있는 변수들의 값을 문자열로 표현하는 기능으로 사용함

public class Person {
    String name;
    int age;

    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "이름 : " + name + ", 나이 : " + age;
    }
}
class PersonTest {
    public static void main(String[] args) {
        Person p1 = new Person("홍길동", 20);
        System.out.println(p1.toString()); //.toString()은 생략 가능
    }
}

  실행 결과 -> 이름 : 홍길동, 나이 : 20

+) @ : annotation 어노테이션 -> 개발자의 실수를 미연에 방지해주는 기능

    @Override -> 오버라이딩 문법이 맞는지 검사

 

4-2. equals() : 객체와 매개변수로 들어온 데이터가 같은지 비교하여 참, 거짓으로 리턴해주는 기능

  비교의 기준은 클래스마다 다르기 때문에 오버라이딩해서 비교의 기준을 코드로 구현해야 함.

public class Person {
    String name;
    int age;

    Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    //이름과 나이가 같으면 동일한 객체
    @Override
    public boolean equals(Object obj) {
        Person p = (Person) obj;
        return name.equals(p.name) && age == p.age;
    }
}
class PersonTest {
    public static void main(String[] args) {
        Person p1 = new Person("홍길동", 20);
        Person p2 = new Person("홍길동", 25);

        if (p1.equals(p2)) {
            System.out.println("같은 사람");
        }
        else {
            System.out.println("다른 사람");
        }
    }
}

 +) String 클래스의 equals() 메소드는 String 클래스가 별도로 만든 메소드가 아니라 Object 클래스에서 선언된 equals() 메소드를 오버라이딩하여 문자열을 비교할 수 있도록 기능을 재정의한 것이다!