Post

변수

자바는 객체지향적인 언어이다. 객체지향적 언어 전에는 C언어와 같은 절차적 언어를 사용하였는데 소프트웨어가 발전함에 따라 프로그램을 업그레이드 시켜야했다. 이를 쉽게하기 위해서 나온 것이 객체지향적 언어이다.

객체 지향적 언어 = 프로그래밍 언어 + 객체지향적 개념

객체지향적 개념은 캡슐화, 상속, 추상화, 다형성이다. 이를 통해서 코드의 재사용성이 높고, 유지보수가 쉬우며 코드의 중복을 제거해준다.

객체 사용

객체를 사용하는 단계는 다음과 같다.

  1. 클래스 생성
  2. 객체(인스턴스) 생성
  3. 객체(인스턴스) 사용

객체는 크게 인스턴스 변수의 묶음으로 변수 (속성)와 메소드(기능) 로 이루어진다.


예를 들어, 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타입의 하나의 객체의 주소값을 저장하는 참조변수이다. 
    변수는 하나의 값을 저장하는 공간이고 참조변수도 변수이기 때문에 
    참조변수에는 하나의 객체 주소값이 들어간다.
    */

Alt text



변수


변수의 종류는 변수의 선언 위치에 따라 달라지고 위치는 클래스 영역과 메소드 영역으로 나뉜다.

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 변수는 클래스가 메모리 로딩할 떄 한번만 초기화하며 인스턴스 변수는 객체를 생성할 떄마다 초기화한다.

  1. 자동초기화
    자동적으로 멤버변수는 컴파일러로 인하여 0, False, Null로 초기화된다.

  2. 명시적 초기화(간단 초기화)
    1
    2
    
    int i = 0;
    Book b = new Book();
    

    ’=’를 사용하여 값을 대입하는 방식

  3. 복잡 초기화
    • 인스턴스 변수: 생성자 사용
    • 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 { }객체 생성
객체 생성할 떄마다
자동초기화명시적 초기화{ }생성자 
cv01222222 
iv    0123 
This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.