목표 : 객체지향 프로그래밍 언어의 특징인 인스턴스와 생성자를 활용하여 어플리케이션을 최적화하기
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 )
- 인스턴스 사용방법 : "참조변수.멤버변수" / "참조변수.메소드 호출" 형식으로 사용함
4) 정적(Static) 변수 예제1, 예제2, 예제3
- 프로그램 실행전 코드영역에 생성 (static 멤버들은 Heap영역이 아닌 Static영역에 할당된다)
즉, static이 붙어있는 멤버변수는 메인 메소드가 만들어지기 전 시점에 만들어짐
- 프로그램 실행전에 사용준비가 완료됨 (예시1, 예시2)
2.생성자(Constructor) 개념1, 개념2, 개념3, 예제1, 예제2, 예제3
1) 개념
- 멤버변수의 초기화를 담당 (new 사용)
- 실행 : 객체 생성시 자동으로 실행 됨
- 사용 :리턴 타입이 누락됨, 메서드 이름이 클래스이름이어야 함 (메서드 이름은 대문자 아님), 매개변수 생략 가능
2) 생성자 오버로딩
- 동일한 이름으로 생성자를 여러개 선언
- 다양한 인자를 지정하여 객체를 생성할 수 있음 ( 인자값을 다양하게 주려고 메서드 오버로딩을 하는 것 처럼 활용)
3) 기본생성자
- 인자값이 없는 생성자, 생성자가 하나도 선언되지 않을때 자동으로 생성
- 스택에 내부적으로 만들어지는 변수, 호출하러 갈때마다 this가 만들어짐
this는 현재 메소드가 실행중인 인스턴스의 주소값을 가르킴
- 멤버변수와 지역변수의 구분 : 지역변수(i)와 멤버변수(heap에 만들어진 i)가 동일할때 this로 구분
- 생성자 호출 : 객체 지향은 유지보수성이 좋아야 하는데, 중복된 코드를 this()를 활용(생성자호출)해서 바꿀수 있음
: 생성자호출개념
**자동으로 실행되는 메소드 구현 : public static void main(String args[]) {} 개념1
'개발 > JAVA' 카테고리의 다른 글
3. 언어특성활용 (3) 다형성, 내부클래스 (0) | 2022.06.19 |
---|---|
3. 언어특성활용 (2) 상속, 추상화, 인터페이스 (0) | 2022.06.19 |
2. 기본문법 (4) 객체지향 개요 (0) | 2022.06.13 |
2. 기본문법 (3) 배열(Array) (0) | 2022.06.12 |
2. 기본문법 (2) 실행순서 - 조건문, 반복문, 제어문 (0) | 2022.06.12 |