-
[자바기초] 객체지향 프로그래밍 특징(다형성) 정리노트º Language º/Java 2023. 3. 25. 16:54
* 객체 지향 프로그래밍의 특징
1. 은닉성 : 외부의 다른 클래스로부터 속성(맴버변수)를 보호하는 것.
2. 상속성 : 이미 있는 클래스를 확장하여 새로운 클래스를 만드는 것. 코드의 재사용성을 높일 수 있습니다.
이번에 알아 볼 특징은 '다형성'입니다.
3. 다형성 : 객체들에게 동일한 메소드를 주었을 때 객체마다 동작하는 방식이 다른 것.
* 어떻게 같은 메소드 값을 주었는데 다를 수가 있느냐?..
- 객체 참조변수를 출력문에 표현하게 되면 그 객체가 바라보고 있는 메모리의 주소값이 출력이 되어요.
예를 들면,
Person p = new Person(); // p는 person 클래스 객체의 참조 변수입니다.
System.out.println(p); // 이와 같이 출력을 할 때에 주소값만이 출력됩니다.
자세히 말하자면, 객체와 배열은 참조 자료형이죠?
값을 바로 출력하는 것이 아니라,, 객체와 배열은 힙메모리(속성)에 저장되기에 스택메모리(참조변수)에서는 힙 메모리에 있는 주소값을 가리키는 역할만을 합니다.
그러므로 그 객체를 구성하는 속성 값, 즉 힙메모리에 저장되어있는 메모리를 출력하기 위해서는 object의 toString 메소드를 오버라이딩(overriding) 합니다. (자바의 모든 클래스는 object라고 하는 클래스의 후손입니다.)
예시와 함께 알아봅시다.
* toString 메소드
@Override public String toString() { return "Product [name=" + name + ", price=" + price + "]"; }
> 부모 클래스에서 toString으로 제품의 이름과 가격을 나타낼 수 있도록 맴버메소드를 만들어 두었습니다.
@Override public String toString() { return "DiscountProduct [discount=" + discount + ", name=" + name + ", price=" + price + "]"; }
> 이를 자식 클래스에서 오버라이딩 하여 제품의 이름, 가격의 맴버변수를 부모 클래스에서 물려받고 자신의 맴버변수 discount를 추가하였습니다.
- 이처럼 메소드 오버라이딩이란 부모 클래스에서 생성한 메소드가 자식 클래스에서 표현 해야 할 메소드에 만족하지 않을 때 필요한 값을 추가하여 재정의하는 것을 말합니다.
메소드 오버라이딩을 할 때에 메소드 이름, 자료형, 매개변수의 개수가 같습니다.
- 추상 메소드 오버라이딩 또한 마찬가지 입니다.
미래의 자식 클래스에서 꼭 가져야할 메소드가 있지만 부모 클래스에서 자식 클래스들이 가져야 할 공통 속성과 동작을 알 수 없을때 구체화 할 수 없으니 body가 없는 추상 메소드를 선언만 합니다.
이를 자식 클래스에서 오버라이딩 하여 구체화 하여 메소드를 작성합니다.
이또한, 메소드 이름, 자료형, 매개변수의 개수가 같습니다.
다형성이란 대체 무엇인가에 대한 답이 나왔습니다.
- 다형성이란 상속 관계에 있을 때,
각 클래스들에 동일한 이름으로 오버라이딩 된 메소드가 각각의 클래스마다 서로 다른 기능을 한다는 것입니다.
그렇다는 것은 같은 메소드에 이름으로 호출해도 각 객체마다 다른 메소드가 호출된다는 거겠죠?
+ 추가
* equals
- 메모리의 주소값이 같은 지 다른지에 대해 알아보기 위한 메소드 'equals' 에 대해 예시를 통해 알아보기로 합시다.
public class EqualsTest { public static void main(String[] args) { Person p1 = new Person("홍길동",29); Person p2 = new Person("홍길동",29); if (p1.equals(p2)) { System.out.println("같아요"); }else { System.out.println("달라요"); } }
> if문 조건식에 p1 .equals(p2)를 사용했다면 해당 문자열이 같은지 다른지 알아보는 것이기에 "같아요"가 출력됩니다.
만약 객체 참조변수의 '==' 은 같은 메모리를 참조하고 있는 지 평가합니다. 출력문은 "달라요"가 출력 될 것입니다.
이렇게 같은 속성 값들을 가지고 있는지 판별 하기 위하여 object의 equals를 오버라이딩하여 사용하게 됩니다.
이클립스 화면 구현창 오른쪽 마우스 클릭 - source - Generate hashCode and equals > 위와 같이 기본 메소드를 제공하는 곳에 'Generate hashCode and equals' 가 존재합니다.
hashCode는 그리 중요한 것은 아닙니다. equals메소드를 살펴보면 다음과 같습니다.
예시)
String name;int age;-> 맴버변수로 만들어진 equals 메소드를 참조 해봅시다.
equals 메소드 > 노란 칸의 내용은 더 철저히 파악하기 위한 것이며, 빨간 칸 안에 있는 부분이 중요한 부분입니다.
boolean 자료형으로 참, 거짓을 판별합니다.
'º Language º > Java' 카테고리의 다른 글
[자바기초] 컬렉션 프레임워크의 종류 (3가지), 제네릭 정리노트 (0) 2023.03.29 [자바기초] String, StringBuffer, String Builder 정리노트 (0) 2023.03.29 [자바기초] 객체지향 프로그래밍 특징(상속성) 정리노트 (0) 2023.03.23 [자바기초] 객체지향 프로그래밍 정의 및 특징(은닉성) 정리노트 (0) 2023.03.20 [자바기초] 배열 정리노트 (0) 2023.03.17