자바와 객체 지향 2

JunSeong_Park·2022년 12월 25일
0

저번에 자바의 객체 지향을 위한 특징 중 상속에 대해 간단하게 설명한 것을 T메모리(스태틱,스택,힙 영역)으로 구분 지어보면 좋겠단 생각이 들어 먼저 짚고 다음 특징으로넘어가 보겠다

위와 같은 코드가 있다고 가정해 보자

5번째 줄까지 실행했을 때

여기에서 주의 깊게 봐야할 점은 상속받은 클래스의 인스턴스뿐만 아니라 상위 클래스의 인스턴스도 같이 생성된다는 것이다 (그리고 pororo 라는 변수는 Penguin 이라는 클래스의 인스턴스에 속하는 Heap영역의 메모리 주소를 가리키는 pointer 즉 reference 변수인 것 같다 본인의 생각이다)

13번째 줄까지 실행했을 때

자 heap 영역에 생성된 동적 메모리 할당은 두 객체 모두 같다(new 연산자는 동적 메모리 할당을 하는 연산자이며 이를 통해 Penguin() 생성자를 사용하여 동적 메모리(heap 영역)에 객체 영역을 할당해준 것이기 때문이다)

그렇다면 5번째 줄과 다른 것은 무엇일까

객체 참조 변수를 선언할 때 우리가 지정해준 Type에 따라 그 변수가 point할 수 있는 메모리 할당 주소가 달라진다는 것이다..여기서 우리가 한가지 알아야할 사실이 있는데 자바의 상속에서는 생성자를 사용할 때 상위 클래스의 생성자를 호출한다..그것이 동적 메모리가 할당될 때 Animal 과 Penguin 이 같이 생성된 이유이다 이는 자바 개발을 하는 사람이라면 반드시 알아야하는 정말 기초적인 개념에 해당한다고 생각한다..
마저 말을 이어가보자면 pingu와 pororo의 선언 부를 보면 우리가 지정한 타입이 다르단 걸 알 수 있다..이젠 보일 것이다 객체 참조 변수라는 의미가 우리가 객체 참조 변수를 선언한다는 것이 무슨 의미인지 포인터가 가리킨다는 것이 무엇을 의미하는지
우리가 저렇게 상위 클래스의 객체 참조 변수를 생성하고 그 상위 클래스를 상속(재사용,확장)한 클래스의 생성자로 heap영역에 할당하면 스스로 자신의 선언부에 맞는 할당 주소로 찾아가는 것을 암묵적 형변환 (promotion) 이라고 한다(이는 이 책에 내 생각이 더해진 정리이다)

위의 내용을 이해한 사람이라면 코드의 주석 부분을 해제하면 어떻게 될 지 알 것이라 생각한다



3. 다형성(Polymorphism) : 사용편의성

개념만 콜아웃으로 짚어보자

오버라이딩 : 같은 메서드 이름, 같은 인자 목록으로 상위 클래스의 메서드를 정의
오버로딩 : 같은 메서드 이름, 다른 인자 목록으로 다수의 메서드를 중복 정의

이해가 쉽게 바로 T메모리로 예제를 들어보겠다
위에서 사용한 Penguin 클래스를 조금 수정하여
이러한 내용이 추가된다고 가정해보자
그런 다음 이러한 예제를 사용하면 어떻게 될까? ( showName 을 주의깊게 보자 )

5번째 줄까지 실행한 결과

보면 showName()을 보면 overriding했다는 것과 showName(string yourName)메서드를 overroading(중복정의)했다는 것을 알 수 있다
그렇다면 10번째와 11번째 줄을 실행하면 어떤 결과가 나올까

어머 내 이름은 알아서 뭐하게요?
초코람보 안녕, 나는 뽀로로라고 해

12번째 줄은 당연한 결과이므로 짚지 않고 14번째 줄로 넘어가보자

14번째 줄까지 실행한 결과

자 pingu라는 객체 참조 변수가 왜 Penguin 이 아니라 Animal 을 가리키는지는 이제 알 것이고, 우리가 주목해야하는 것은 pingu.showName() 의 출력 값이다

어머 내 이름은 알아서 뭐하게요?

T메모리를 보면 당연한 결과겠지만 짚고 넘어가자면 showName() 이라는 메서드 자체가 하위 클래스의 생성자를 통해 상위 클래스의 메서드가 overriding된 상태로 재정의되는 것을 볼 수 있다.

하나만 기억하자 상위 클래스 타입의 객체 참조 변수를 사용하더라도 하위 클래스에서 오버라이딩한 메서드가 호출된다



4. 캡슐화(Encapsulation) : 정보은닉

이해를 못하더라도 외우자

부연설명을 조금 하자면 저기에 있는 public, protected, default, private 는 접근 제어자라고 하며 직접 써보면 이해가 더 빠를 것이다 ( 구글에 자바 접근 제어자 예시만 검색해도 이해하기 좋은 설명과 예시가 수두룩 하니 찾아보자 )

중요한 내용이 있어 다시 정적 변수와 인스턴스 변수를 언급해 보겠다(이 또한 캡슐화의 일부라고 생각하니 읽어보길 바란다)

  1. 상속을 받지 않았다면 객체 멤버는 객체를 생성한 후 객체 참조 변수를 이용해 접근
  2. 정적 멤버는 클래스명.정적 멤버 형식으로 접근하는 것을 권장

생각해보면 1번은 당연한 얘기니 넘어가도록 하고 2번에 대해서 짚어보자면 T메모리를 생각해보자 정적 변수의 위치가 어디였는지 기억하는가 바로 스태틱 영역이다 그럼 스태틱 영역에 있는 변수를 클래스.멤버 가 아닌 인스턴스.멤버 방식으로 호출하면 무슨 일이 일어날까
쉽게 정리해보면

1. 클래스.멤버
	스태틱 영역의 정적 변수 호출

2. 인스턴스.멤버
	스택 영역의 인스턴스 참조 변수 접근
    힙 영역의 인스턴스 호출
    스태틱 영역의 클래스 정적 변수 호출

사람.인구수 = 클래스.멤버
홍길동.인구수 = 인스터스.멤버

얼마나 비효율적인 접근인지 바로 이해가 될 것이라 생각한다

출처 : 스프링 입문을 위한 자바

이 자료를 통해 알게 되는 몰랐던 것들이 많다..몰랐다기보단 알고는 있지만 세세하지 못했던 부분들이긴 한데 객체 지향이란 인간 지향이라는 점을 이 책에서 말하는데 이 부분은 자바나 개발에 관심이 있는 사람이라면 꼭 봤으면 하기 때문에 이 책을 추천한다. 책은 작가의 의도나 생각이 담겨 있다. 그게 없다면 애초에 책이라 부르질 않는다..사람은 살면서 불편함을 겪고 해결하며 단기간에 빠른 진화를 거쳤다 우리는 이것을 문명의 발전이라고 부르고 컴퓨터관련 다양한 분야에서 우리는 이러한 진보의 발전과 변화를 제일 빨리 느낀다고 본다 이 책에는 프로그래밍 언어에 대한 간략한 역사도 알려주는데 이 부분도 교양적인 측면에서 도움이 많이 될 것이라 생각한다

profile
안녕하세요 언어에 구애 받지 않는 개발자가 되고 싶은 박준성입니다

0개의 댓글