JAVA/수업 복습

자바 공부기록 37 - 생성자 메소드(매개변수) / 멤버메소드 오버로딩/ this

본이qq 2022. 4. 27. 17:24

●생성자 메소드의 매개변수 사용

 생성자에 전달인수를 만들고 다른 값을 전달하여, 객체마다 멤버변수의 초기값을 객체 생성과 동시에 달리 하여 시작할 수 있습니다.

 매개변수로 다양한 데이터 타입 이용 가능 (int, double, String, int...a, 객체...)

1
2
3
4
5
6
7
8
9
10
11
12
13
class Cclass{
    private int age;
 
    Cclass(int a) {
        age = a;
    }
 
}
 
public static void main(String[] args) {
        Cclass c1 = new Cclass(20);
        Cclass c2 = new Cclass(30);
 
cs

c1 객체에는 초기값 20으로 설정 // c2 객체에는 초기값 30으로 설정

 

 

CClass c3 = new Cclass();   // 에러

클래스 내부에 매개변수를 갖든 안갖든, 생성자가 꺼내어지고 정의가 되면 

숨어 있던 디폴트 생성자는 꺼내어지고 새로 정의된 생성자로 대체되어 없어 집니다.

 

-> 그래서 CClass 에서 아무런 매개변수를 갖지 않는 생성자 메소드를 만들어줘야 위 코드에서 에러가 안남

-> CClass(){}

 

 

●멤버메서드의 오버로딩 (메서드의 이름이 같고 매개변수의 데이터타입, 개수, 순서 등등이 다른것)

 

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
public class Class13 {
 
    public static void main(String[] args) {
        
        Sum s = new Sum(2536);
        
        System.out.println("s.add()의 결과 : " + s.add()); // a+b
        System.out.println("s.add(23)의 결과 : " + s.add(23)); // 23+a+b
        System.out.println("s.add(59,65)의 결과 : " + s.add(59,65));
        System.out.println("s.add(58,98,78,36,59)의 결과 : " + s.add(58,98,78,36,59) );
    }
 
}
 
//멤버 메서드의 오버로딩
class Sum{
    private int a;
    private int b;
    Sum( int c, int d){
        a = c;   b = d;
    }
    
    public int add() {  
        return a+b;     
    }
    /*
    public int add( int c ) {
        return a+b + c;    
    }
    public int add(int c, int d) { 
        return a+b+c+d;  
    }
    */
    public int add(int... c) {
        int tot =0;
        for(int i=0; i<c.length; i++) tot += c[i];
        return a+b+tot;
    }
}
 
cs

-멤버메소드 add(){} 의 오버로딩 

-매개변수를 다양하게 지정하여 사용할 수 있음

 

 

 

 

●this.

- 멤버변수와 지역변수(매개변수)와 부득이하게 이름이 같았을때, 그 둘을 구분하기 위해 멤버변수 앞에  this. 을 붙여서 사용합니다

- this 키워드는 클래스 내부에서사용되는 모든 멤버 변수에 원래 붙어 있지만 사용 편의상 확실히 멤버변수로 구분할 수 있는 경우 생략해.    서 사용 (but 붙여서 사용할 수도 있음)

 

-this 변수는 레퍼런스(참조) 변수입니다

-클래스의 멤버필드들은 new 라는 키워드에 의해서 각각의 객체별로 생성됩니다. (서로 다른(겹치지 않는) 메모리 공간)

 

-반면, 멤버 메서드는 생성된(오버로딩 포함) 메서드별로 하나만 존재하며 모든 객체들이 공유해서 필요시 호출합니다.

-이때 현재 메서드를 호출한 객체가 어떤 객체인지 구분하여 실행될 수 있게 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
class ThisB{
    private int num;
    
    ThisB( /* ThisB this  */ ){
        this.num = 0;
    }
 
    public void setNum(int num  /* , ThisB this  */ ) {
        // 메서드를 호출한 객체가 매개변수  this  에 저장됩니다
        this.num = num;
    }   
 
 
    public void prn(/* , ThisB this  */) {
        System.out.printf("num = %d\n"this.num);
    }
}
 
 
public class Class15 {
 
    public static void main(String[] args) {
        ThisB b1 = new ThisB();
        ThisB b2 = new ThisB();
        
        b1.setNum(100);
        b2.setNum(200);
        
        b1.prn();
        b2.prn();
}
}
 
cs

출력값 

num = 100

num = 200

-모든 멤버메서드에서는 메서드를 호출한 객체의 주소가 'this'변수에 저장되어 있음 

 

this 의 용도 : 멤버메서드를 호출한 호출객체의 참조변수값(주소값)을 전달받아 전달된 메서드를 호출한 객체를 식별하는 용도로 사용됩니다. 보통 멤버변수를 this 없이 사용해도 이름이 중복된 매개변수가 없다면 내부적으로 this 가 붙어서 실행됩니다.

 

 

 

1
2
3
4
5
6
7
8
public class Class15 {
 
    public static void main(String[] args) {
                ThisB b3 = b1;
                
                b3.setNum(300);   // b3 의 변수값변경은 b1 의 변경이기도 합니다.
                b1.prn();
                b3.prn();
cs

ThisB b3 = b1;

-> b1 이 저장한 참조값(주소)을  b3에 저장 (인스턴스는 하나, 같은 주소를 갖는 참조 변수는 두개의 효과)

-> 위 연산은  new 를 이용하여 b3 에 새로운 공간을 만든게 아니라,

   b1위 레퍼런스 값만 복사 저장한 결과로, b1 과 b3 는 같은 공간의 주소를 저장하고 있기 때문에

   출력값은 num = 300

          num = 300

 

 

 
1
2
3
4
5
6
7
public class Class15 {
 
    public static void main(String[] args) {
                ThisB b4 = new ThisB( b2 ); 
                b2.setNum(500);  // 전달인수로 객체의 주소를 보냅니다.        b2.setNum(500);
                b2.prn();
                b4.prn();
cs

-b4라는 새로운 객체를 만들고 b2의 데이터를 b4에 복사

-출력값 num = 500

           num = 200

 

 

 

 

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class ThisB{
    public void copy1(ThisB b/* , ThisB this */) {
        this.num = b.num;
        //main 메서드에서 b5.copy1(b2); 이와 같이 호출되었다면
        //this <- b5          b<- b2
    }
 
}
 
public class Class15 {
 
    public static void main(String[] args) {
       ThisB b5 = new ThisB();
        b5.copy1(b2);
        b2.setNum(700);
        b2.prn();
        b5.prn();
 
}
}
 
cs

-b5 새로운 객체를 만들고 (new)
 copy1() 멤버메소드를 호출하여 매개변수에 있는 데이터를 호출한 객체(this)에 복사하기 

-출력값 num = 700

        num = 500

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class ThisB{
      public ThisB copy2(/*  ThisB this */) {
        //ThisB b6 = b4.copy2();        this<-b4   실행결과가 리턴돼서 b6로 되돌려짐
        ThisB temp = new ThisB();
        temp.num = this.num;
        return temp;
        
    }
 
public class Class15 {
 
    public static void main(String[] args) {
        ThisB b6 = b4.copy2();
        b2.setNum(900);
        b2.prn();
        b6.prn();
        
}
 
}
    
cs

- 새로운 객체를 만들고, 호출한 객체(this)의 데이터를 그 새로운 객체에 복사하는 멤버 메소드 copy2(){}

  결과적으로 그 새로 만들어진 객체를 반환(return)까지 해야됨

- temp라는 새로운 객체를 만들고 그 temp안에 있는 멤버변수에 this(b4)의 데이터를 대입하고 return한다

- 출력값  num = 900

          num = 700

 

 

※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
class ThisC{
    
    private int num1;
    private int num2;
    private int num3;
 
ThisC(int n){
        num1 = n;
        System.out.println("ThisC클래스의 생성자1이 호출되었습니다");
    }
ThisC(int n1, int n2){
        this(n1); 
        num2 = n2;
        System.out.println("ThisC클래스의 생성자2이 호출되었습니다");
    }
ThisC(int n1, int n2, int n3){
        this(n1,n2);
        num3 = n3;
        System.out.println("ThisC클래스의 생성자3이 호출되었습니다");
        
    }
 
public class Class16 {
 
    public static void main(String[] args) {
        ThisC t1 = new ThisC(10);
        System.out.println();
        ThisC t2 = new ThisC(20,30);
        System.out.println();
        ThisC t3 = new ThisC(10,20,30);
 
    }
 
}
 
cs

-this를 사용한 생성자간 호출 코드는 반드시 생성자의 명령 중 첫번째 실행코드로만 사용 가능합니다.