아하
검색 이미지
생활꿀팁 이미지
생활꿀팁생활
생활꿀팁 이미지
생활꿀팁생활
보람찬하마170
보람찬하마17021.05.24

자바 this에 관해 질문드립니다

package lib2;

import java.awt.*;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import javax.swing.*;

class MyFrame2 extends JFrame{

public MyFrame2() {

super("Listener입니다.");

setDefaultCloseOperation(JFrame.EXITONCLOSE);

Container conpane=getContentPane();

conpane.setBackground(Color.ORANGE);

conpane.setLayout(new FlowLayout());

JButton bb=new JButton("Hello");

bb.addActionListener(new MyActionLis());

setSize(300,300);

setVisible(true);//프레임보여줌

conpane.add(new JButton("Click"));

conpane.add(new JButton("OK"));

conpane.add(new JButton("Cancel"));

conpane.add(bb);

}

private class MyActionLis implements ActionListener{

public void actionPerformed(ActionEvent e) {

JButton b=(JButton)e.getSource();

if(b.getText()=="1")

b.setText("3");

else

b.setText("1");

  • MyFrame2.this.setTitle(b.getText());

}

}

}

public class myFrame {

public static void main(String[] args) {

MyFrame2 frame=new MyFrame2();

;

}

}

이부분에서 this를 굳이 써야하는 이유가 있을까요..??

MyFrame2.setTitle(b.getText())와 다른점을 도저히 모르겠습니다

55글자 더 채워주세요.
답변의 개수3개의 답변이 있어요!
  • 탈퇴한 사용자
    탈퇴한 사용자21.05.24

    안녕하세요.

    MyFrame2.this.setTitile(b.getText()) : 인스턴스 메소드 호출 방식

    MyFrame2.setTitle(b.getText()) : 정적 메소드 호출 방식

    setTitle 메소드 선언을 할 때 static을 사용하지 않았으면 위에 방식, static을 선언했으면 아래 방식을 사용합니다.

    static으로 선언하지 않았는데 아래 방식으로 호출 했을 경우에는 컴파일 오류가 발생합니다.


  • 중첩클래스에서 하위클래스(MyActionLis)에서 상위클래스(MyFrame2) 객체에 접근하기 위해서 사용되는 것입니다.

    하위클래스는 외부에서 생성할 수가 없고 상위클래스에서만 생성가능합니다.

    (하위 클래스를 static으로 선언하면 외부에서 생성할수 있으나 이경우에는 MyFrame2.this를 사용할수 없습니다. static public class MyActionLis {} )

    위에서 하위클래스는 외부에서 생성할수 없다고 말씀드렸습니다. 그것은 하위클래스가 생성되었으면 상위클래스가 반드시 생성되었다는 것을 의미합니다.

    따라서 MyFrame2.this 는 하위클래스를 생성한 상위클래스의 객체를 의미하며 상위클래스의 함수들을 하위클래스에서 호출하기 위해서 사용됩니다.

    MyFrame2.setTitle()는 잘못된 코드입니다. setTitle()함수가 static이 아니기 때문에 호출할수 없습니다.


  • [내용 요약]

    하지만 소스코드가 복잡해지고 변수가 많아지면 관리하기가 힘들기 때문에 필드와 매개변수를 동일하게 정의하고 this.로 구분하는 것이 편리하다.

    -----------------------------------------------------------------------------------------------------------------------------------------------------------------------

    출처 : https://m.blog.naver.com/PostView.naver?blogId=heartflow89&logNo=220957355593&proxyReferer=https:%2F%2Fwww.google.com%2F

    this.

    소스코드를 보면 this라는 키워드를 종종 보았을 것이다. this는 인스턴스의 자기 자신을 의미한다. this.은 주로 필드(전역변수)와 메소드 또는 생성자의 매개변수가 동일할 때 인스턴스 필드임을 명확히 하기 위해 사용한다. 말이 어렵다. 예제를 보면 쉽게 이해가 될 것이다.

    import java.util.Scanner;

    public class InstanceMemberEx02 {

    int a, b; // 필드

    public InstanceMemberEx02(int a, int b){ // 생성자(매개변수)

    this.a = a; // this.a는 필드 / a는 매개변수를 의미

    this.b = b; // this.b는 필드 / b는 매개변수를 의미

    }

    public void sum(){ // 메소드

    int sum = 0; // 초기값

    if(a<b){

    for(int i = a; i<= b; i++){

    sum += i; // 누적합 / sum = sum + i;

    }

    }else{

    for(int i = b; i<= a; i++){

    sum += i; // 누적합 / sum = sum + i;

    }

    }

    System.out.println(sum);

    }

    public static void main(String[] args) {

    Scanner sc = new Scanner(System.in);

    System.out.println("2개의 정수 입력");

    int a = sc.nextInt();

    int b = sc.nextInt();

    InstanceMemberEx02 im = new InstanceMemberEx02(a, b);

    im.sum();

    }

    }

    위 예제는 a~b까지의 누적합을 구하는 예제이다.

    여기서 중요한 것은 필드와 생성자를 보면 된다.

    필드의 int a, int b와 생성자의 매개변수가 동일한 변수명을 갖고 있다.

    이때 main 메소드에서 전달된 매개값을 필드값으로 대입하려고 한다.

    변수명이 동일하기 때문에 필드라는 것을 명확히 하기 위해 this.을 붙여준다.

    만일 생성자에서 a = a; b = b;라고 코드를 작성하면 필드의 값은 변경되지 않고 초기값(0)을 갖게된다.

    (필드의 초기값) 매개변수와 필드의 변수명이 다를 경우는 this를 쓰지 않아도 상관없다.

    하지만 소스코드가 복잡해지고 변수가 많아지면 관리하기가 힘들기 때문에 필드와 매개변수를 동일하게 정의하고

    this.로 구분하는 것이 편리하다.