변수
자바는 객체지향적인 언어이다. 객체지향적 언어 전에는 C언어와 같은 절차적 언어를 사용하였는데 소프트웨어가 발전함에 따라 프로그램을 업그레이드 시켜야했다. 이를 쉽게하기 위해서 나온 것이 객체지향적 언어이다.
객체 지향적 언어 = 프로그래밍 언어 + 객체지향적 개념
객체지향적 개념은 캡슐화, 상속, 추상화, 다형성
이다. 이를 통해서 코드의 재사용성이 높고, 유지보수가 쉬우며 코드의 중복을 제거해준다.
객체 사용
객체를 사용하는 단계는 다음과 같다.
- 클래스 생성
- 객체(인스턴스) 생성
- 객체(인스턴스) 사용
객체는 크게 인스턴스 변수의 묶음으로 변수 (속성)와 메소드(기능) 로 이루어진다.
예를 들어, mp3(객체)를 사용하기 위해서는 mp3 설계도(클래스)로 객체를 만들어야한다. 설계도 안에는 mp3의 속성(색깔, 크기, 전원상태, 곡)과 기능(재생, 전원키기, 전원끄기, 다음곡넘기기, 이전곡으로 돌아가기) 을 추가해야한다. 코드로 나타내면 다음과 같다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Class Mp3{ // 클래스
//변수
int power;
String color;
Music music;
static int width;
static int height;
//메소드
void powerOn(){}
void powerOff(){}
void afterMusic(){}
void beforeMusic(){}
void playMusic(){}
}
코드가 실행되는 메인함수에서는 다음과 같이 객체를 생성하고 힙메모리에서는 그림과 같이 객체가 생성된다.
1
2
3
4
5
6
Mp3 mp3 = new Mp3(); //참조변수 선언 후 객체 생성
/*
mp3는 Mp3타입의 하나의 객체의 주소값을 저장하는 참조변수이다.
변수는 하나의 값을 저장하는 공간이고 참조변수도 변수이기 때문에
참조변수에는 하나의 객체 주소값이 들어간다.
*/
변수
변수의 종류는 변수의 선언 위치에 따라 달라지고 위치는 클래스 영역과 메소드 영역
으로 나뉜다.
1
2
3
4
5
6
7
8
9
10
11
12
13
Class Alphabet{ // 클래스영역 시작
int A;
String B;
static int C;
static String D;
void method(){ //메소드 영역 시작
int D;
} // 메소드 영역 끝
} // 클래스 영역 끝
클래스 영역에 속하고 타입 앞에 static이 붙은 C,D은 클래스 변수이고 클래스를 메모리에 올릴 때 자동 생성된다. 객체 간의 공통적인 속성이다. 클래스 영역에 있는 변수 A,B는 객체는 생성할 때 만들어지는 인스턴스 변수이고 객체의 개별적인 속성이다. 메소드 영역에 속한 D는 지역변수이고 변수 선언 시 생성된다.
변수종류 | 선언위치 | 생성시기 | 소멸시기 |
---|---|---|---|
클래스 변수 (static변수) | 클래스 영역 | 클래스가 메모리에 로딩될 때 | 프로그램이 종료될 때 |
인스턴스 변수 | 클래스 영역 | 객체가 생성될 때 | 참조변수가 없을 때 가비지컬렉터에 의해 자동 제거 |
지역 변수 | 메소드 영역 | 변수가 선언될 때 | 메소드의 블럭을 벗어날 때 |
변수의 초기화
변수를 선언하고 특정 값을 넣어주는 것을 변수의 초기화라고 한다.
- 멤버변수(인스턴스 변수, static변수), 배열인 경우에는 자동으로 초기화가 된다.
- 지역변수는 생명주기가 짧기 때문에 매번 자동 초기화해주는 것은 성능 저하를 초래할 수 있다. 다른 메소드에서 사용하던 쓰레기 값을 덮어 쓰는 방식으로 초기화해주기 때문에 수동초기화를 해야한다.
멤버변수 초기화 방법
static 변수는 클래스가 메모리 로딩할 떄 한번만 초기화하며 인스턴스 변수는 객체를 생성할 떄마다 초기화한다.
자동초기화
자동적으로 멤버변수는 컴파일러로 인하여 0, False, Null로 초기화된다.- 명시적 초기화(간단 초기화)
1 2
int i = 0; Book b = new Book();
’=’를 사용하여 값을 대입하는 방식
- 복잡 초기화
- 인스턴스 변수: 생성자 사용
- static 변수: static{} 사용
- 인스턴스 변수: 생성자 사용
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Class InitTest{
static int cv = 1;
/*
static int cv; // 자동초기화
cv = 1; // 명시적 초기화
*/
int iv = 1;
/*
int iv; // 자동초기화
iv = 1; // 명시적초기화
*/
static{ cv = 2; } // static {}
{iv = 2;} // {}
InitTest(){
iv = 3;
} // 생성자
}
static 변수 초기화 | 인스턴스 변수 초기화 | ||||||||
---|---|---|---|---|---|---|---|---|---|
클레스를 메모리에 로딩 한번만 초기화 | 자동 초기화 | 명시적 초기화 | static { } | 객체 생성 객체 생성할 떄마다 | 자동초기화 | 명시적 초기화 | { } | 생성자 | |
cv | 0 | 1 | 2 | 2 | 2 | 2 | 2 | 2 | |
iv | 0 | 1 | 2 | 3 |
Comments powered by Disqus.