본문 바로가기
CS/JAVA

[JAVA] 변수와 메서드

by 두둠칫 2020. 10. 30.

1. 선언 위치에 따른 변수의 종류

종류 선언위치 생성시기 비고 저장위치
멤버변수 클래스변수 클래스영역 클래스가 메모리에 올라갈 때  - 키워드 static를 붙여 표시
 - 모든 인스턴스가 하나의 클래스 변수 저장공간을 공유
Method area
인스턴스변수 인스턴스가 생성되었을 때  - 독립적인 저장공간을 가짐 Heap
지역변수(로컬변수) Method 영역 변수 선언문이 수행되었을 때
(메서드 종료 시 소멸)
  Stack

 

 

 

2. 메서드

- 클래스 메서드는 같은 클래스 내의 인스턴스 메서드, 변수를 호출할 수 없다.

: 클래스 메서드가 실행될 때 인스턴스 메서드, 변수가 아직 생성되지 않았을 수도 있기 때문이다.

  즉, 클래스 메서드는 인스턴스 메서드, 변수를 쓰는 메서드가 아니다.

  따라서 인스턴스를 사용하는 클래스 메서드가 있다는 것은 설계를 잘못했다는 결론으로 이어진다.

 

- 인스턴스 메서드는 클래스 메서드, 변수를 호출할 수 있고 인스턴스 역시 가능하다.

: 하나의 인스턴스 멤버가 존재한다는 것은 클래스 인스턴스가 이미 생성되었다는 것이고,

  이는 다른 인스턴스 멤버들도 모두 존재한다는 뜻이기 때문이다.

 

 

 

3. JVM의 메모리구조

응용프로그램이 실행되면 JVM은 시스템으로부터 프로그램을 수행하는데 필요한 메모리를 할당받고 용도에 따라 여러 영역으로 나누어 관리한다.

영역 원소 설명
Method Area 클래스 데이터
(클래스 변수 포함)
 
Call Stack 메서드 실행
(지역변수, 중간결과 등)
- 메서드 수행에 필요한만큼 메모리 할당
- 메서드 종료시 메모리 반환 및 제거
Heap 인스턴스  

 

 

 

4. 오버로딩(Overloading)

- 조건

1) 메서드 이름이 같고

2) 매개변수의 개수 또는 타입이 달라야 한다.

 

- 가변인자

ex) void func(Type... name){ }

: 가변인자는 내부적으로 배열을 이용한다.

  따라서 무분별한 사용은 필요없는 배열의 선언으로 이어지므로 비효율적이므로 필요할 때만 사용하자.

 

 

 

5. 생성자(Constructor)

- 조건

1) 생성자의 이름은 클래스의 이름과 같아야한다.

2) 리턴값이 없다.

* 연산자 new가 인스턴스를 생성하는 것이지 생성자가 인스턴스를 생성하는 것이 아니다.

 

- 생성자에서 다른 생성자 호출

1) 생성자의 이름으로 클래스이름 대신 this 사용

2) 한생성자에서 다른 생성자를 호출할 때는 첫 줄에서만 호출 가능

 

this : Heap에 load된 인스턴스 자신을 가리키는 참조변수, 인스턴스의 주소가 저장되어 있음

this(params) : 생성자, 같은 클래스의 다른 생성자를 호출할 때 사용

 

여러 개의 생성자를 사용할 때 this를 적절히 이용한다면 좀 더 직관적이고 객체지향적인 코드 생성 가능하다.

 

 

 

6. 변수의 초기화

- 순서

static > instance > 생성자

 

- 초기화

1) 멤버 변수는 자동적으로 초기화

2) 지역 변수는 초기화 안하면 에러

: 지역 변수는 계산을 수행하기 위해 선언되며 프로그래머는 값을 설정해야한다.

  만약 프로그래머가 실수로 지역 변수를 초기화하지 않는다면 예상치 못한 출력 값이 나올 수 있기 때문에

  컴파일러는 이를 방지하기 위해 프로그래머에게 값을 초기화하라고 알려주도록 설계 된 것.

 

- 종류

1) 명시적 초기화

2) 생성자

3) 초기화 블럭

  형태 초기화 시점 초기화 순서 비고
클래스 초기화 블럭 static { } 클래스가
처음 load될 때 한번
기본값
> 명시적초기화
> 클래스 초기화 블럭
- 둘 다 코드의 중복을 제거하여 재사용성을 높이고 오류 발생 가능성을 낮추는 효과를 가질 수 있다.

- 초기화 순서가
곧 코드의 순서이기도 하다.
인스턴스 초기화 블럭 { } 인스턴스 생성 될때마다 기본값
> 명시적초기화
> 인스턴스 초기화 블럭
> 생성자

 

- static

static keyword가 붙은 변수는 메모리에 load 될 때, 단 한번만 생성된다.

즉, 해당 변수를 멤버 변수로 가진 모든 instance는 해당 하나의 static 변수를 공유한다.

따라서 static 변수는 new(인스턴스 생성) 없이 사용 가능하다.

 

static method도 동일하며 특히 singleton pattern을 위해 사용된다.

static method 안에서 instance 변수와 this keyword 사용이 불가능 한 것은 위의 내용에 따라 자명하다.

'CS > JAVA' 카테고리의 다른 글

[JAVA] Abstract, Interface  (0) 2021.01.12
[JAVA] 상속, 다형성, 캡슐화  (0) 2021.01.12
[JAVA] 데이터의 메모리 할당 순서  (0) 2021.01.12
[JAVA] 변수 : 타입  (0) 2020.10.11
[JAVA] 개요  (0) 2020.10.11