컴퓨터 관련/JAVA 강의

java #12 생성자, 멤버변수와 인스턴스변수, this

승명 2016. 12. 18. 19:26

java #12 생성자, 멤버변수와 인스턴스변수, this

 
* 생성자(constructor)

- 클래스가 객체로 만들어질때 (객체화) instance 변수에 기본으로 들어가야 할 값을 부여할 때 사용
- 실행되어야 할 코드를 넣어주는 method의 일종
- 클래스의 이름과 동일하게 만들어진다.
- 반환형이 없다.
- method 호출하듯이 직접 호출은 불가능하다.
- 생성자는 객체화를 해야 호출된다.
- this, super를 사용해서 생성자를 호출할 수 있다.
- overload 지원(객체화를 다양하게 할수있다.)
- 개발자가 코딩시 생성자를 정의하지않으면 컴파일러가 인자없는 기본생성자를 넣어준다.
- 개발자가 생성자를 하나라도 정의하면 컴파일러는 기본생성자를 만들지 않는다.


* 멤버변수와 인스턴스변수 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package day0218;
 
/**
* stack에 올라가는 변수의 이름과 heap에 올라가는 변수의 
* 이름이 같을 때 heap과 stack을 구분하여 사용하고 싶다면 객체가
* 생성될때 저장된 heap의 주소를 넘겨주어서 사용하면 된다.
*
* @author SiSt
*/
public class UseInstance {
     int i;// heap에 생성되는 변수, 객체마다 각각 생성된다.
 
     // member변수, instance변수
public void method(int i, UseInstance ui){//지역변수, 매개변수(파라메터)는 stack에 잡힌다.
     //i=i; //stack에 생성된 i에 i를 할당
     //stack에 있는 값을 heap에 전달
     System.out.println("전달받은 heap의 주소: "+ ui);
     ui.i=i;//스택은 사라지지만 힙에 들어간 값은 유지됨
}//method
    
     public static void main(String[] args) {
          //ui instance(객체)는 heap에 생성된 주소를 stack에서 저장
         
          UseInstance ui = new UseInstance();
          System.out.println(ui);
          ui.method(200, ui);//stack에 생성된 method에 heap의 주소를 전달
          System.out.println(ui.i);
     }// main
 
}// class
cs


* 클래스 작성법 

접근지정자 class 클래스명 extends 부모클래스명 implements 구현할interface명 ...{
- 접근지정자
public : 다른 package에서 호출 가능
default : 다른 package에서 호출 불가능
- 클래스명 : 낙타체, 첫글자 대문자.
- 부모클래스명 : 1개
- 구현할interface명 : 여러개


* 생성자 작성법

- 접근지정자 클래스명(매개변수...){
- 접근지정자
public : 클래스 외부에서 객체화 가능
protected : 동일 패키지의 다른 클래스에서 객체화 가능. 패키지가 다르면 상속관계의 자식클래스만 객체화
private : 외부에서 객체화할 수 없음
default : 동일패키지의 다른 클래스에서 객체화 가능. 패키지가 다르면 객체화 할 수 없음.


* this

- 객체(instance)가 가지고 있는 자원(변수, method)을 사용할 때 간편하게 쓸수있는 키워드
- 객체화 후 인스턴스 영역에서 사용할 수 있다.
- static영역은 객체가 만들어지기 전에 호출되므로 사용할 수 없다.
- 키워드형식과 메소드형식 두가지 형태로 사용할 수 있다.
- 메소드 형태(생성자의 첫번째 줄에서만 사용 가능)
  this(); this(값...); 
- 현재 클래스의 다른 생성자를 호출
- 생성자의 첫번째 줄에서만 사용 가능.
- 재귀호출이 되면 error가 발생. (자신을 다시 호출)

 생성자

객체화 

결과 

1
2
3
4
5
6
7
8
9
public class T{
    public T(){
    this(10);
        S.O.P("기본");
    }
    public T(int i){
        S.O.P("인자");
    }
}
cs
new T();인자
기본
1
2
3
4
5
6
7
8
9
public class T{
    public T(){
    this(10);
        S.O.P("기본");
    }
    public T(int i){
        S.O.P("인자");
    }
}
cs
new T(2);인자
1
2
3
4
5
6
7
8
9
public class T{
    public T(){
        S.O.P("기본");
    }
    public T(int i){
        this(4);
        S.O.P("인자");
    }    
}
cs
new T(2);
에러발생
1
2
3
4
5
6
7
8
9
10
11
public class T{
    public T(){
        this(2);
        S.O.P("기본");
    }
    public T(int i){
        this();
        S.O.P("인자");
        }
    }
}
cs
new T();에러발생


*this 2
키워드형식 : 생성된 객체 자신이 가지고 있는 member변수, method를 호출할때 사용.
this.변수명
this.메소드명
생성된(사용하고 있는)객체의 주소로 변환
- 객체화 후에 사용할 수 있다.
- static에서는 객체가 생성되기 전에 호출되기 때문에 this를 사용할 수 없다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package day0219;
 
/**
* this의 keyword형식의 사용.
* this.변수명, this.메서드명();으로 사용한다. 
* this 생성되어 현재 사용하는 객체의 주소로
* 변환되는 키워드
*
* @author
*/
public class ThisKeyword {
     int i; // member변수 (instance 변수)
     int j;
 
     public void method(int i) {
          j = 10;// member변수가 parameter와 이름이 다르다면 heap에 생성된 변수를 사용하게 된다.
         
          this.i = i;  //member변수의 이름과 parameter의 이름이 같다면 parameter를 우선적으로 사용.
                       //이때 this를 쓰면 멤버 변수 i를 가르키게 된다. 없을땐 지역변수 i를 가르킨다.
         
 
          System.out.println("method 내에서의 this " + this);
 
     }// method
 
     public static void main(String[] args) {
          // System.out.println(this); //static에서는 객체가 만들어지기 전에 호출되기 때문에 
          // this를 쓸 수 없다.
          ThisKeyword tk = new ThisKeyword();
          System.out.println("tk객체의 힙의 주소 "+tk);//tk의 번지 1db05b2
         
          ThisKeyword tk1 = new ThisKeyword();
          System.out.println("tk1객체의 힙의 주소 "+tk1);//tk의 번지 1db05b2
         
          tk.method(10);
          tk1.method(10);
 
     }// main
 
}// class