▶this란?
-. 자기 자신을 의미하는 키워드
-. 클래스 안에서 this를 사용하여 "자기자신"을 표현한다.
-. 이 this 키워드를 통해 클래스, 메서드 및 생성자에서 자기자신의 데이터를 업데이트하거나 조작할 수 있다.
-. 자바에서 this의 쓰임새는 총 3가지이다.
▶this.멤버변수
this를 사용하여 지역변수와 멤버변수(전역변수)를 구분할 수 있고 데이터에 값을 대입할 수 있다.
class Student{
(1) String name;
public void setName(){
(2) String name;
name = "자바학생";
}
}
Student라는 클래스 안에 name(1)은 전역변수, name(2)는 지역변수로서 두 이름이 name 으로 동일해도 서로 각자의 개별적인 변수이기때문에 자바 프로그램상에선 충돌이 나지 않지만 업무를 진행하면서 혼란이 일어날 수 있고 데이터가 잘못 대입되는 등의 오류가 있을 수 있다.
(2)번 지역변수에 문자값을 입력하고 싶다면 name = "자바학생"처럼 setName() 내부에서 데이터를 대입해준다. 멤버변수와 지역변수가 동일한 이름으로 공존할 경우, 유효성 범위가 작은(그 변수가 쓰여지는 범위가 작은) 변수가 우선적으로 인식되기때문이다.
그럼 name(1)에 데이터를 입력하고 싶다면 어떻게 할까? (1)name에는 JYP (2)에는 자바학생이라는 이름을 할당해주고싶을 때 this를 사용한다.
class Student{
(1) String name;
public void setName(){
(2) Stirng name;
name = "자바학생"; //현재 지역변수 name
this.name = "JYP학생"; // 클래스 지역변수 name
}
}
그럼 파라미터를 받는 메서드에서 전역변수에 값을 넣어주려면 어떻게 해야할까?
class Student{
(4) String subject;
(2) String name;
(1) public void setName( String name ){
(3) this.name = name;
(4) subject = "수학";
syso(subject);
}
}
참고로 말하자면 (1)의 String name은 지역변수이다. String type의 name은 setName이라는 메서드 안에서만 사용할 수 있다. 즉, 파라미터도 해당 메서드 안에서만 유효한 지역변수의 일종임을 알 수 있다.
(2)의 전역변수의 name에 (1)의 Stirng name값을 넣고싶을 때 (3)자리에 this.name = name; 을 넣는다.
즉, 파라미터를 사용하여 멤버변수의 값을 간접적으로 설정하고자 할 경우, this키워드를 사용하여 멤버변수와 파라미터를 전역변수에 전달해준다. this.전역변수명 = 전역변수는 setName()으로 받는 데이터값을 전역변수에 넣어주는 공식이라고 생각하면 편하다.
Student 클래스를 기준으로 s1이라는 객체를 하나 만들었다고 가정했을 때 s1.setName( "국어") 로 넣으면 출력은 수학,국어로 출력이 될 것이다.
모든 멤버변수 앞에는 this 키워드를 사용하여 멤버변수임을 직관적으로 표시하는 것이 소스코드의 가독성을 위하여 바람직하다.
this는 메서드에도 전달이 가능한데 이는 this 키워드를 사용하는 것이 필수적인 것은 아니다.
위 코드를 보면 Main함수서 Student라는 객체를 생성했다. 그리고 getName()에서 "자바학생"이라는 값을 대입하고 return시켰다. 근데 Main 함수에는 sayName()을 통해 그 값을 호출시키기를 원했고 sayName은 getName()을 호출시키고 myname이라는 본인만의 지역변수에 담아 syso로 myname이라는 값을 호출시켰다.
이 때 sayName은 this.getName()을 사용하여 본인이 아닌 다른 메서드에 접근하여 값을 빼내왔지만, 여기서 this가 꼭 필요하지는 않다. 그래서 메서드를 사용하는 this인 경우, this.getName()이 아닌 getName()을 사용하는 것을 코드 가독성을 위해 권장한다.
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
|
class Member{
private String name;
private int age;
//getName(),retrun,전역변수 name
public String getName(){
return this.name;
}
//setName(), param name, 전역변수 name = param name
public void setName(String name){
this.name = name;
}
//getAge(), return, 전역변수 age
public int getAge(){
return this.age;
}
//setAge(), param age,전역변수 age = param age
public void setAge(int age){
this.age = age;
}
public void say(){
System.out.println(this.getName());
System.out.println(getAge());
}}
public class Main01{
public static void main(String[] args) {
//Member class 객체생성
Member member = new Member();
//메서드를 사용하여 전역변수 name, age에 임의의 데이터 할당
member.setName("자바학생");
member.setAge(18);
member.say();
member.setName("DB학생");
member.setAge(40);
}}
|
cs |
▶this()
this를 메서드처럼 사용할 경우, 현재 클래스의 다른 생성자를 의미한다.
this키워드를 사용하여 오버로딩할 때 this()를 사용한다.
생성자 안에서만 사용한다
반드시 생성자 블록에서 첫번째 줄에 코딩한다.
-> 생성자 내에서 초기화 작업 도중 다른 생성자를 호출
-> 호출된 다른 생성자 내에서도 멤버변수를 초기화
-> 다른 생성자 호출 이전의 초기화 작업이 무의미
*파라미터가 있는 생성자 입력코드
1
2
3
4
5
6
7
8
9
10
11
12
13
|
|
public class Article {
private int seq;
private String subject;
private String writer;
//파라미터가 있는 생성자
public Article(int seq, String subject, String writer){
this.seq = seq;
this.subject = subject;
this.writer = writer;
}
|
cs |
seq, subject, writer라는 멤버변수를 가지고있는 Article이라는 클래스에 생성자를 설정함과 동시에 값을 할당해주는 코드를 작성하였다. Main에서는 Article a1 = new Article(1,"첫번째게시물","자바학생")을 생성하여 Article에 데이터를 정상적으로 넘겨줄 것이다. 근데 개발을 하다가 게시판의 subject의 값이 아직 정해지지않아 "제목없음"으로 놔두어야하고 writer은 "익명"이라는 값을 고정으로 놔두고싶다면 어떻게 할까?
이럴때 사용하는 것이 this()이다.
*this()를 이용한 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
public Article(int seq,String writer){
1) this(seq, "제목없음", writer);
/* this.seq = seq;
this.subject = "제목없음"; // 이렇게 새로 할당해주면 된다.
this.writer = writer; */
}
// subject와 writer의 값을 받지 않는 것이다.
2) public Article(int seq, "제목없음", "입력"){
this.seq = seq;
this.subject = "제목없음"; // 이렇게 새로 할당해주면 된다.
this.writer = "익명";
}
//toString()
public String toString(){
return "ARticle [ seq = " + seq
+ "], subject = "
+ subject
+ "], writer = "
+ writer;
}
|
cs |
만약 subject의 값이 아직 정해지지않았다면 넘겨줄 데이터값은 없을 것이다. Main에서는 Article a1 = new Article(1,"자바학생")만 데이터를 넘겨줄 것이다. 그래서 1번의 코드에서 값은 seq와 writer만 받을 것이고 subject 에는 "제목없음"이라는 값을 할당시켜준다. 이는 고정시키고 싶은 값을 내 마음대로 지역변수에 할당 시키는 것이다.
this를 메서드로 사용하여 생성자 오버로드를 간결하게 처리해주는 방법이 위와같은 방법이다. 코드 2번처럼 this를 하나씩 작성 해주는 것도 가능하지만, 코드의 간결화를 위해 1번처럼 코딩해주는 것이 best이다.
Article 클래스는 this를 통해서 (seq,"제목없음",writer)로 Article(int seq, String subject, String writer) 생성자를 모두 호출하고 있는 것이다. 즉, 다른 생성자를 호출하는데에 this가 사용된 것
아마 아직 이해가 잘 안갈것이다. 예제 하나를 더 보자
*초기화 코드가 중복(employeeNo,name,age,salary)되어있는 생성자
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
|
public class Employee {
int employeeNo;
String name;
int age;
int salary;
// 기본 생성자 형태의 생성자
public Employee() {
this.employeeNo = 0;
this.name = "Annoymity";
this.age = 0;
this.salary = 0;
}
public Employee(int employeeNo, String name) {
this.employeeNo = employeeNo;
this.name = name;
}
public Employee(int employeeNo, String name, int age) {
this.employeeNo = employeeNo;
this.name = name;
this.age = age;
}
}
|
cs |
*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
|
public class Employee {
int employeeNo;
String name;
int age;
int salary;
// 기본 생성자 형태의 생성자
// Employee Aaron = new Employee();
public Employee() {
this(0, "Anonymity", 0, 0);
}
// Employee Aaron = new Employee(40022, "남주혁");
public Employee(int employeeNo, String name) {
this.employeeNo = employeeNo;
this.name = name;
}
// Employee Aaron = new Employee(40022, "남주혁", 29)
public Employee(int employeeNo, String name, int age) {
this(employeeNo, name);
this.age = age;
}
}
|
cs |
Main에보면 이름은 같지만 서로 넘겨주는 멤버변수가 다른 객체를 생성하는 코드가 총 3개가 있었을 것이다. Employee란 이름으로 오버로딩된 위의 코드는 객체를 생성할 때 마다 각각 초기화해줄 수 밖에 없는 상황이 나오는데 그 상황을 초기화가 중복된 상태(첫번째코드)라고 이해하면 편하다. 이를 this로 정리한 코드가 두번째코드이다.
두번째코드를 보면 기본생성자는 this(0,"Anonymity",0,0)으로 바로 값을 할당해주었다. 이는 기본생성자는 파라미터가 없기에 가능하였고 파라미터가 있는 생성자는 this.age = age;처럼 초기화를 해주어야한다.
this()는 파라미터가 서로 다른 생성자들이 하나의 완전한 생성자를 호출하도록 하여, 데이터의 초기화를 한 곳에서 일괄적으로 처리하도록 구현할 수 있게한다. 데이터에 대한 초기화를 어떤 특정 한 곳에서 일괄적으로 처리해주고자하는 의도가 있는 것이다.
'국비필기노트 > Java' 카테고리의 다른 글
자바(java)_추상화,추상 메서드,인터페이스,implements (0) | 2022.03.25 |
---|---|
자바(java)_접근한정자 (0) | 2022.03.24 |
자바(java)_Getter & Setter (0) | 2022.03.22 |
자바(java)_객체형변환, 객체 배열, instanceof (0) | 2022.03.21 |
자바(java)_오버로드(Overload)&오버라이드(Override) (0) | 2022.03.21 |