06. 객체지향 구현

Wendy·2020년 6월 13일
0
post-thumbnail

[리뷰] 처음 해보는 자바 프로그래밍 - 06.객체지향 구현

내용 정리

6.1 클래스와 객체, 그리고 인스턴스

6.1.1 클래스와 객체 생성

  • 객체를 사용하려면 반드시 메모리에 생성해야 함 : new 클래스명();
  • 인스턴스 : 메모리에 생성한 각각의 독립적인 객체 (~~클래스의 인스턴스)
// 메모리에 3개의 인스턴스 생성
new Person(); 
new Person(); 
new Person(); 
  • 객체 : 프로그래밍으로 표현하려는 실체
  • 클래스 : 실체를 추상화 한 설계도 (필드 + 메서드)
  • 인스턴스 : 설계도로 만든 독립적인 객체

6.1.2 자바의 메모리

1) Code 영역 : 메서드, 정적멤버 영역. JVM의 class loader가 클래스 파일을 load
2) Heap 영역 : 인스턴스(필드만)가 생성되는 영역. 메서드는 코드영역 것 사용
3) stack 영역 : 지역변수 저장. thread별로 stack 소유. 메서드별로 frame 소유.

  • 필드 : 클래스의 속성을 나타냄. 메모리 생성 후 자동 초기화(0, \u0000, false, null 등)
    - new Person(); >> heap에 인스턴스(필드) 생성 >> 자동 초기화
  • 지역변수 : 메서드에서 잠시 사용. 선언과 동시에 초기화 작업 필요
    - 메서드 호출 >> stack에 매개변수 생성 후 인자값으로 초기화 + 지역변수 생성 >> 메서드 종료 시 사용했던 변수들 stack에서 자동 삭제

6.1.3 참조변수를 이용해 인스턴스에 접근

public void test(){
	Person p = new Person();
}

1) test의 지역변수 p를 stack 영역에 생성
2) new 명령문으로 heap영역에 Person 인스턴스가 생성되고 참조정보(메모리 위치정보) 반환
3) 반환된 참조정보를 p에 대입 (p는 지역변수이자 참조변수)

  • 참조변수 : heap에 생성된 인스턴스의 참조 정보를 가지는 변수
    자바 프로그램은 heap, code 메모리에 직접 접근 불가(stack 영역만 가능)
    따라서 stack에 참조변수를 통해 인스턴스에 접근
  • 참조가 끊긴 인스턴스(Unreachable Object)는 JVM의 가비지 콜렉션 작업이 일어날 때 메모리에서 삭제됨
  • Object를 상속받은 Wrapper 클래스(String, Integer 등)들도 참조변수를 통해 heap에 접근하지만 Immutable이라 값 수정 시 동작방식은 다름 (heap 주소를 찾아가 데이터를 바꾸는게 아니라 heap 내 다른 곳에 값을 새로 생성)

6.2 정적 멤버(static member) 선언

  • 클래스의 모든 인스턴스가 공유
  • static 키워드 사용
  • 필드와 메서드 모두 선언 가능
  • 프로그램 시작 시 메모리의 코드 영역에 할당되어 프로그램 종료시까지 유지

6.2.1 클래스 필드

  • heap에 인스턴스 생성 시 static 붙은 필드는 heap에 할당하지 않고 code 메모리에서 참조
  • 참조변수 없이 클래스명.필드명 으로 접근 가능

6.2.2 클래스 메서드

  • public static void main(){ } << 클래스 new 없이 main 함수 실행을 위해 static을 붙였구나!!
  • static 메서드 : 클래스 메서드 <> 나머지 메서드 : 인스턴스 메서드

6.2.3 정적 코드 블록

  • static{ }
  • main() 메서드 실행 전 딱 한번 실행
  • static 클래스 필드를 초기화하거나, 프로그램 실행 시 먼저 처리 할 작업이 있을 때 사용

6.3 생성자

6.3.1 생성자 개요

  • new 명령문 실행(인스턴스 생성) 순서 :
    1) heap 메모리에 인스턴스 생성
    2) 필드 생성 및 자동 초기화
    3) 생성자 호출

6.3.4 자신을 가리키는 키워드 this

  • 현재 실행중인 인스턴스의 주소값
  • 새로운 메서드 실행 시 내부적으로 자동 생성되는 변수
  • 용도 : 클래스 멤버를 지시 / 생성자 호출 (생성자 내 첫줄) / 자신의 주솟값 전달
  • JVM의 변수 검색 순서 : 1) stack 내 실행중인 메서드의 프레임 2) this가 참조하는 인스턴스

기타

  • 하나의 소스파일에 클래스 여러개 선언 :
    - 소스파일 내 한 개 클래스를 public으로, 나머지는 다른 제한자로 지정
    - public 클래스를 파일명으로 지정
    - 컴파일 후 각 클래스별로 실행파일(~.class) 생성

학습 후기

이번 장은 내가 가장 제대로 알고싶었던 부분이고, 이 책의 가장 멋진 챕터인 것 같다. 중요한 내용을 그림과 함께 이해하기 쉽게 설명해주었다. 완전 짱짱!!

추가 참고

https://yaboong.github.io/java/2018/05/26/java-memory-management/

profile
개발 공부중!

0개의 댓글