본문 바로가기

개발/JAVA

3. 언어특성활용 (1) 객체 지향 구현 (Instance, Constructor)

목표 : 객체지향 프로그래밍 언어의 특징인 인스턴스와 생성자를 활용하여 어플리케이션을 최적화하기

 

1.인스턴스(Instance)

 1) 개념 
 -  인스턴스란 설계된 클래스를 new 명령문으로 메모리에 생성한 대상이다.

 -  oop의 관점에서 객체가 메모리에 할당되어 실제 사용될 때 '인스턴스'라고 부른다.

   * 메모리에 객체를 선언할때 "new 클래스이름()" 으로 선언하며, 이때 생성된 객체를 인스턴스라 함

 

 2) JVM 메모리의 구조 

 - JVM은 메모리를 3가지 영역으로 구분하는데, Code영역, Heap영역, Stack 영역이 있다.

코드영역 힙영역 스택영역
실행코드들이 사용하는 영역 멤버변수들이 사용하는 영역 지역변수들이 사용하는 영역

   (1) 코드(code)영역 = 메소드(method) 영역   개념1개념2
    - 클래스에 대한 정보와 함께 클래스 변수(static variable)가 저장되는 영역

    - JVM은 특정 클래스가 사용되면 해당 클래스의 클래스 파일(*.class)를 읽어들여, 정보를 메소드 영역에 저장

  *과정 :  소스파일.java -(컴파일)-> 실행파일.class -(실행)-> JVM 안에 있는 '클래스로더' 구동  -> Byte code verifier -> .... 

  ** 클래스로더(class loader) : .class 파일 실행을 위해 코드영역 메모리에 로딩하는 일을 한다. 만든 메서드도 포함됨. 

    (2) 힙(heap) 영역   개념1
    - 자바에서 사용되는 모든 인스턴스 변수가 저장되는 영역 
    - new 인스턴스가 생성되면, 해당 인스턴스의 정보를 힙 영역에 저장

     * 멤버변수는 heap 메모리에 만들어질때 자동으로 초기화 된다. (멤버변수는 자동으로 초기화 되는 특징이 있음) 

        and 변수타입 기본으로 0으로 초기화, boolean은 false로 초기화, 모든 참조변수는 null 로 초기화 됨
    - 힙은 메모리의 낮은 주소에서 높은 주소의 방향으로 할당

     * 메모리 누수 

    (3) 스택(stack) 영역 개념1,
     - 메소드가 호출될 때 메소드의 스택 프레임이 저장되는  영역, 지역변수들이 사용하는 영역임 

       * 지역변수는 메소드 안에서 선언된 변수들. 개발자가 접근할 수 있는 메모리는 heap과 stack 임 

     - 메소드가 호출되면, 메소드의 호출과 관계되는 지역 변수와 매개변수를 스택 영역에 저장

     - 메소드의 호출로 할당되지만, 메소드의 호출이 완료되면 소멸하므로 주의 cf.스택 프레임(stack frame) 
     - 푸시(push) : 데이터를 저장 /  팝(pop) : 데이터 인출 

 - JVM은 Java Virtual Machine의 약자로, 자바 가상 머신을 말한다. (설명1, 설명2)

 3) 참조변수 

  - heap 메모리 주소값을 가지는 변수 

  - heap 메모리에는 멤버변수, stack에는 지역변수가 만들어짐. 

    이때, heap 메모리에 접근하지 못할 때 인스턴스는 참조변수를 통해 사용

  - test() 메서드 실행시 인스턴스 사용  ( 예제1, 예제2

  - 인스턴스 사용방법 : "참조변수.멤버변수" / "참조변수.메소드 호출" 형식으로 사용함 

   *JAVA가 느린이유 

 

 4) 정적(Static) 변수   예제1, 예제2, 예제3

  - 프로그램 실행전 코드영역에 생성  (static 멤버들은 Heap영역이 아닌 Static영역에 할당된다)

    즉, static이 붙어있는 멤버변수는 메인 메소드가 만들어지기 전 시점에 만들어짐

  - 프로그램 실행전에 사용준비가 완료됨 (예시1, 예시2)

 

 

2.생성자(Constructor)  개념1, 개념2, 개념3, 예제1, 예제2, 예제3 

 1) 개념 

     - 멤버변수의 초기화를 담당 (new 사용)

     - 실행 : 객체 생성시 자동으로 실행 됨

     - 사용 :리턴 타입이 누락됨, 메서드 이름이 클래스이름이어야 함 (메서드 이름은 대문자 아님), 매개변수 생략 가능 

 
  2) 생성자 오버로딩

     - 동일한 이름으로 생성자를 여러개 선언 

     - 다양한 인자를 지정하여 객체를 생성할 수 있음 ( 인자값을 다양하게 주려고 메서드 오버로딩을 하는 것 처럼 활용)

 

  3) 기본생성자 

     - 인자값이 없는 생성자, 생성자가 하나도 선언되지 않을때 자동으로 생성

 

  4) this 변수  개념1, 개념2, 예제1 

     - 스택에 내부적으로 만들어지는 변수, 호출하러 갈때마다 this가 만들어짐

       this는 현재 메소드가 실행중인 인스턴스의 주소값을 가르킴

     - 멤버변수와 지역변수의 구분 : 지역변수(i)와 멤버변수(heap에 만들어진 i)가 동일할때 this로 구분 

     - 생성자 호출 : 객체 지향은 유지보수성이 좋아야 하는데, 중복된 코드를 this()를 활용(생성자호출)해서 바꿀수 있음
       : 생성자호출개념

 

**자동으로 실행되는 메소드 구현 :   public static void main(String args[]) {}     개념1