this 키워드
- 자신의 인스턴스 주소값을 저장하는 참조 변수 => 개발자가 생성하는 것이 아니라 자바에 의해 자동으로 생성됨
- 모든 인스턴스 내에는 this가 존재하며, 자신의 인스턴스 주소가 저장됨 =>즉, 인스턴스마다 this에 저장된 값이 다름
레퍼런스 this
- 자신의 인스턴스 내의 멤버에 접근(멤버변수 or 멤버메서드)
- 주로, 로컬변수와 인스턴스 변수(=멤버변수)의 이름이 같을 때 인스턴스 변수를 지정하는 용도로 사용
<레퍼런스 this 사용 기본 문법>
자신의 클래스 내의 생성자 또는 메서드 내에서 this.인스턴스 변수 또는 this.메서드()형태로 접근
class Person {
// 멤버변수 선언
private String name;
private int age;
} // Person class 끝
class Person {
// 멤버변수 선언
private String name;
private int age;
// 이름, 나이를 전달받아 초기화하는 파라미터 생성자 정의
// alt shift s -> o
public Person(String name, int age) {
super();
[this.name](<http://this.name/>) = name;
this.age = age;
} // public Person(String name, int age) 끝
} // Person class 끝
멤버변수 Getter / Setter 메서드 정의
alt shift s - > r (getter/ setter)
// 멤버변수 Getter / Setter 메서드 정의
// alt shit s -> r
public String getName() {
// 로컬변수와 멤버변수 이름이 중복되지 않으므로
// 레퍼런스 this를 생략 가능!
return name; //return this.nam; 과 동일함
}
public void setName(String name) {
// 메서드 내의 로컬변수와 클래스 내의 멤버변수의 이름이 같을 경우
// 메서드 내에서 변수 지정 시 로컬변수가 지정됨
// name = name; // 로컬변수 name값을 다시 로컬변수 name에 저장하는 코드
// 로컬변수와 멤버변수를 구별하기 위해서는 멤버변수 앞에
// 레퍼런스 this 사용하여 해당 인스턴스에 접근하는 코드로 사용해야함
// => 외부에서 멤버변수 name에 접근 시 참조변수명.name 형태로 접근하듯이
// 내부에서 멤버변수 name에 접근 시 this.name 형태로 접근해야함
this.name = name; // 로컬변수 name값을 멤버변수 name에 저장하는 코드
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
// showPersonInfo() 메서드를 정의해서 이름과 나이를 출력
public void showPersonInfo() {
// 클래스 내의 메서드에서 멤버변수에 접근하기 위해 멤버변수 이름 지정
System.out.println("이름: " + name); // =this.name
System.out.println("나이: " + age); // =this.age
}
} // Person class 끝
public String getName() {
// 로컬변수와 멤버변수 이름이 중복되지 않으므로
// 레퍼런스 this를 생략 가능!
return name; //return this.nam; 과 동일함
}
public void setName(String name) {
// 메서드 내의 로컬변수와 클래스 내의 멤버변수의 이름이 같을 경우
// 메서드 내에서 변수 지정 시 로컬변수가 지정됨
// name = name; // 로컬변수 name값을 다시 로컬변수 name에 저장하는 코드
// 로컬변수와 멤버변수를 구별하기 위해서는 멤버변수 앞에
// 레퍼런스 this 사용하여 해당 인스턴스에 접근하는 코드로 사용해야함
// => 외부에서 멤버변수 name에 접근 시 참조변수명.name 형태로 접근하듯이
// 내부에서 멤버변수 name에 접근 시 this.name 형태로 접근해야함
this.name = name; // 로컬변수 name값을 멤버변수 name에 저장하는 코드
}
Person p = new Person("땅콩",1);
p.showPersonInfo();
} //main() 메서드 끝
Person p = new Person("땅콩",1);
p.showPersonInfo();
// p.name="땅콩"; //오류발생
p.setName("땅콩2");
p.setAge(2);
p.showPersonInfo();
} //main() 메서드 끝
예제
Account 클래스 정의
- -멤버변수 : accno, name, balance 선언(private 접근제한자 사용)
- 파라미터 3개를 전달받아 초기화하는 파라미터 생성자 정의
- Getter/Setter 메서드 정의
- showAccountInfo() 메서드 정의 -> 계좌번호, 입금주명, 현재잔고 출력
package this_;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Account acc = new Account("123-4567-890","땅콩",10000);
acc.showAccountInfo();
acc.setAccno("111-2222-333");
acc.setName("땅콩2");
acc.setBalance(20000);
acc.showAccountInfo();
}
}
/*
* Account 클래스 정의
* - 멤버변수 : accno, name, balance 선언(private 접근제한자 사용) * - 파라미터 3개를 전달받아 초기화하는 파라미터 생성자 정의
* - Getter/Setter 메서드 정의
* - showAccountInfo() 메서드 정의 -> 계좌번호, 입금주명, 현재잔고 출력
*
*/
class Account {
private String accno;
private String name;
private int balance;
public Account(String accno, String name, int balance) {
super();
this.accno = accno;
this.name = name;
this.balance = balance;
}
public String getAccno() {
return accno;
}
public void setAccno(String accno) {
this.accno = accno;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getBalance() {
return balance;
}
public void setBalance(int balance) {
this.balance = balance;
}
public void showAccountInfo() {
System.out.println("계좌번호 : " + accno);
System.out.println("예금주명 : " + name);
System.out.println("현재잔고 : " + balance);
System.out.println();
}
}
생성자 this()
- 자신의 생성자 내에서 자신의 또 다른 생성자를 호출
- 레퍼런스 this 사용과 동일하게 자신의 인스턴스에 접근하여 다른 오버로딩된 생성자를 호출하는 용도로 사용
- 생성자 오버로딩 시 인스턴스 변수에 대한 초기화 코드가 중복되는데 초기화 코드 중복을 제거하는 용도로 사용 => 여러 생성자에서 각각 인스턴스 변수를 중복으로 초기화하지 않고 하나의 생성자에서만 초기화 코드를 작성한 뒤 나머지 생성자에서는 해당 초기화 코드를 갖는 생성자를 호출하여 초기화 할 값만 전달 후 대신 인스턴스 변수를 초기화 => 메서드 오버로딩 시 코드의 중복을 제거하기 위해서 하나의 메서드에서만 작업을 수행하고 나머지 메서드는 해당 메서드를 호출하여 데이터를 전달하는 것과 동일함 (단, 메서드는 메서드이름()으로 호출, 생성자는 this()로 호출하는 차이)
<생성자 this() 호출 기본 문법>
생성자 내의 "첫 번째 라인"에서
this([데이터...]);
} // 클래스 끝
class MyDate {
int year;
int month;
int day;
// alt shift s -> o (아무것도 체크x)
public MyDate() {
//연도:1900, 월:1, 일:1로 초기화
// 자신의 생성자 내에서 다른 오버로딩 된 생성자 호출!
this(1900,1,1); // 다른 실행코드보다 무조건 먼저 실행되어야함!
// => public MyDate(int year, int month, int day) { } 생성자가 호출됨
System.out.println("MyDate() 생성자 호출됨!");
// year = 1900;
// month = 1;
// day = 1;
// 인스턴스 변수 초기화 코드
}
// 연도(year)만 전달받고, 나머지는 1월 1일로 초기화하는 생성자
//alt shift s -> o (year만 체크)
public MyDate(int year) {
// MyDate(int, int, int) 생성자를 호출하여
// 전달받은 year와 1월 1일 값을 전달하여 대신 초기화
this(year,1,1);
System.out.println("MyDate(int) 생성자 호출됨!");
// this.year = year; // 레퍼런스 this
// month =1;
// day =1;
}
// year, month를 전달받고, 나머지는 1일로 초기화하는 생성자
// alt shift s -> o (year, month 체크)
public MyDate(int year, int month) {
// MyDate(int, int, int) 생성자를 호출하여
// 전달받은 year, month와 1일 값을 전달하여 대신 초기화
this(year,month,1);
System.out.println("MyDate(int, int) 생성자 호출됨!");
// this.year = year;
// this.month = month;
// day =1;
}
// year, month, day를 전달받고 초기화하는 생성자
// alt shift s -> o (year, month, day 체크)
public MyDate(int year, int month, int day) {
System.out.println("MyDate(int, int, int) 생성자 호출됨!");
this.year = year;
this.month = month;
this.day = day;
}
} // MyDate class 끝
//MyDate()생성자 호출 => 1900년 1월 1일로 초기화
MyDate d1 = new MyDate();
System.out.println(d1.year + "/" + d1.month + "/" + d1.day);
System.out.println("-----------------------------------");
// MyDate(int) 생성자 호출=> 2023년 1월 1일로 초기화
MyDate d2 = new MyDate(2023);
System.out.println(d2.year + "/" + d2.month + "/" + d2.day);
System.out.println("-----------------------------------");
// MyDate(int,int) 생성자 호출=> 2023년 9월 1일로 초기화
MyDate d3 = new MyDate(2023,9);
System.out.println(d3.year + "/" + d3.month + "/" + d3.day);
System.out.println("-----------------------------------");
// MyDate(int,int,int) 생성자 호출=> 2023년 9월 11일로 초기화
MyDate d4 = new MyDate(2023,9,11);
System.out.println(d4.year + "/" + d4.month + "/" + d4.day);
} //main() 메서드 끝
예제
Account2 클래스 정의
- 멤버변수 : accno, name, balance 선언(private 접근제한자 사용)
- 생성자 오버로딩(레퍼런스 this와 생성자 this() 활용)
- 기본 생성자("111-1111-111","땅콩",0)
- 계좌번호를 전달받아 초기화하는 생성자
- 계좌번호, 입금주명을 전달받아 초기화하는 생성자
- 계좌번호, 입금주명, 현재잔고 전달받아 초기화하는 생성자 => 초기화 작업을 수행하는 생성자
- 파라미터 3개를 전달받아 초기화하는 파라미터 생성자 정의
- Getter/Setter 메서드 정의
- showAccountInfo() 메서드 정의 -> 계좌번호, 입금주명, 현재잔고 출력
package this_;
public class Test2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Account2 acc2 = new Account2();
acc2.showAccountInfo();
System.out.println("-------------------------------------");
Account2 acc3 = new Account2("123-4567-789");
acc3.showAccountInfo();
System.out.println("-------------------------------------");
Account2 acc4 = new Account2("123-4567-789","땅콩2");
acc4.showAccountInfo();
System.out.println("-------------------------------------");
Account2 acc5 = new Account2("123-4567-789","땅콩2",10000);
acc5.showAccountInfo();
System.out.println("-------------------------------------");
}
}
/*
* Account2 클래스 정의
* - 멤버변수 : accno, name, balance 선언(private 접근제한자 사용)
* - 생성자 오버로딩(레퍼런스 this와 생성자 this() 활용)
* 1) 기본 생성자("111-1111-111","땅콩",0)
* 2) 계좌번호를 전달받아 초기화하는 생성자
* 3) 계좌번호, 입금주명을 전달받아 초기화하는 생성자
* 4) 계좌번호, 입금주명, 현재잔고 전달받아 초기화하는 생성자
* => 초기화 작업을 수행하는 생성자
* - 파라미터 3개를 전달받아 초기화하는 파라미터 생성자 정의
* - Getter/Setter 메서드 정의
* - showAccountInfo() 메서드 정의 -> 계좌번호, 입금주명, 현재잔고 출력
*/
class Account2 {
String accno;
String name;
int balance;
public Account2() {
this("111-1111-111", "땅콩", 0);
System.out.println("Account2() 생성자 호출됨!");
}
public Account2(String accno) {
this(accno, "땅콩", 0);
System.out.println("Account2(String) 생성자 호출됨!");
}
public Account2(String accno, String name) {
this(accno, name, 0);
System.out.println("Account2(String, String) 생성자 호출됨!");
}
public Account2(String accno, String name, int balance) {
System.out.println("Account2(String, String, String) 생성자 호출됨!");
this.accno = accno;
this.name = name;
this.balance = balance;
}
public void showAccountInfo() {
System.out.println("계좌번호 : " + accno);
System.out.println("입금주명 : " + name);
System.out.println("현재잔고 : " + balance);
}
}
'JAVA' 카테고리의 다른 글
[JAVA] import 키워드 (1) | 2023.09.13 |
---|---|
[JAVA] package(패키지) (0) | 2023.09.13 |
[JAVA] 가변형 인자 (0) | 2023.09.13 |
[JAVA] Pass_by value·reference -메서드 호출 시 값 전달 방식에 따른 차이 (0) | 2023.09.13 |
[JAVA] 2차원 배열 (0) | 2023.09.13 |