ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [자바기초] 객체지향 프로그래밍 특징(다형성) 정리노트
    º 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 자료형으로 참, 거짓을 판별합니다.

     

Coder yein