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() 메소드를 오버라이딩하여 문자열을 비교할 수 있도록 기능을 재정의한 것이다!
'TIL' 카테고리의 다른 글
| 230203 [Java] (예외처리 / 래퍼 클래스 / 컬렉션 프레임워크) (0) | 2023.02.03 |
|---|---|
| 230202 [Java] (String 클래스 / 인터페이스) (0) | 2023.02.02 |
| 230131 [Java] (static / 오버로딩 / 상속) (0) | 2023.01.31 |
| 230130 [Java] (접근 제한자 / 객체 배열) (0) | 2023.01.30 |
| 230127 [Java] (생성자 / this / setter & getter) (0) | 2023.01.27 |