맨날 헷갈리는 자바 2편 - this, this()
안녕하세요! 오늘은 자바 this, this() 그리고 super, super()에 대해 알아보겠습니다!
this는 뭘까요? Look at This! What is This? 할 때 this는 '이것'을 뜻하죠! 자바에서도 똑같습니다! 바로 '자기 자신'을 나타내는 키워드입니다!
super는 뭘까요? SuperMan? 전혀 관련 없겠죠~ㅋㅋㅋ super은 자식 클래스가 부모 클래스로부터 상속받은 멤버를 참조할 때 쓰입니다.
음.. 이게 무슨 말일 까요.. 나 자신을 나타낸다.. 상속받은 멤버를 참조할 때.. 그걸 왜 참 조해? 감이 잘 안 잡히시죠? 바로 코드로 알아보겠습니다!
'맨날 헷갈리는 자바'편은 제 깃허브를 기반으로 작성되었습니다! > https://github.com/babydev-by03KOREA/newJavaBasic
GitHub - babydev-by03KOREA/newJavaBasic: 빵부장 블로그와 연동된 Java Basic!
빵부장 블로그와 연동된 Java Basic! Contribute to babydev-by03KOREA/newJavaBasic development by creating an account on GitHub.
github.com
this 살펴보기!
class Point {
int a;
int b;
public static void main(String[] args) {
Point point = new Point();
point.a = 10;
point.b = 20;
System.out.println("a : " + point.a + " b : " + point.b);
}
class Point {
int a;
int b;
Point(int a, int b) {
this.a = a;
this.b = b;
System.out.println("a: " + a + " b: " + b);
}
public static void main(String[] args) {
Point point = new Point(10, 20);
}
}
두 가지 코드 모두 > a: 10 b: 20을 출력하는 코드였습니다! 어떤 게 더 편해 보이시나요?
맨 위에 코드는 인스턴스 변수 int a; int b;를 선언했고, main 메소드에서 인스턴스화 시켜서 값을 지정해준 후 출력해줬습니다.
아래 코드는 Point Class에 인스턴스변수 int a = 10, int b = 20으로 선언과 동시에 초기화 작업을 해두었네요! 다음 줄은 Point 클래스의 생성자가 있고, 이건 '매개변수가 있는 생성자'라고 합니다! 인스턴스마다 각기 다른 값으로 초기화되어야 하는 경우가 많습니다. 예를 들면 회원가입에 있어서 회원정보는 모든 사람이 다 다르겠죠? 그때마다 지난 포스팅에서 살펴본 DTO(DataTableObject)라는 친구를 사용해서 각기 다른 값으로 초기화 후 setter로 값을 검증 후 getter로 값을 가져다가 사용하는 비즈니스 로직을 자바 백엔드에서는 사용합니다!(모르셔도 됩니다! 그냥 읽고 넘어가세요.) 자세한 건 다음 포스팅에서 생성자에 대해 깊게 다뤄보겠습니다!
Point(int a, int b)로 매개변수를 받는 생성자를 만들어줬습니다. 그러면 우리는 Point를 선언하여 호출할 때 매개변수를 넣어서 생성자로 넘겨주면 됩니다! main 메서드를 보시면 Point클래스를 인스턴스화 시키면서 10과 20을 a와 b에 할당해줬습니다. 그리고 생성자를 호출하면 자동으로 a와 b를 출력하게 만들어뒀네요! 저렇게 값만 넣어주면 a와 b값이 알맞게 출력되겠네요!
어떤가요? 참조 변수. 변수명으로 하나하나 만든 후 출력하는 게 보기 편한가요? 아니면 생성자를 만들어서 매개변수로 넣어서 넘겨주는 게 보기 편한가요? 코드에 있어서 가독성과 유지보수는 매우 중요합니다! 내가 만든다고 끝이 아닙니다!
즉, this는 인스턴스 자신을 가리키는 참조 변수입니다!
this() 살펴보기!
그렇다면 this()는 언제 사용할까요? 같은 클래스 멤버들이 서로 호출 가능한 것처럼 생성자도 생성자끼리 서로 호출이 가능합니다!
단 두 가지 조건이 있습니다.
1. 생성자 이름으로 클래스 이름 대신 this를 사용할 것.
2. 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서 호출할 것.
public class Point {
String userName;
int pointNum;
int pointValue;
Point(String userName, int pointNum, int pointValue) {
this.userName = userName;
this.pointNum = pointNum;
this.pointValue = pointValue;
}
/* Err: 잘못된 코드!
Point(String userName) {
pointNum = 123456; // 생성자는 반드시 첫째줄에서 호출하세요!
Point("빵떡이", 123456, 1000); // 다른 생성자를 호출할땐 클래스명이 아닌 this()를 사용하세요!
} */
}
주석 처리된 코드는 잘못 작성된 코드입니다! 위에 두 가지 조건을 모두 어겼어요!
public class Point {
String userName;
int pointNum;
int pointValue;
Point(String userName, int pointNum, int pointValue) {
this.userName = userName;
this.pointNum = pointNum;
this.pointValue = pointValue;
System.out.printf("가입된 회원:%s" + " pointNumber:%d" + " pointValue: %d\n", userName, pointNum, pointValue);
}
Point(String userName) {
this(userName,1234,1000);
System.out.printf("신규회원:%s" + " pointNumber:%d" + " pointValue: %d\n", userName, pointNum, pointValue);
}
Point() {
this("비회원", 0000, 0);
System.out.printf("비회원:%s" + " pointNumber:%d" + " pointValue: %d\n", userName, pointNum, pointValue);
}
public static void main(String[] args) {
Point pointUser = new Point("박형주", 12345, 5000);
Point pointUserFirst = new Point("신규가입");
Point defaultUser = new Point();
}
}

위는 제가 짠 코드입니다! 위에 생성자는 userName, pointNum, pointValue 모두 받고 있고, 아래는 userName, 맨 아래는 매개변수를 받지 않고 있습니다. 그럼 한번 출력해볼까요? 3개 매개변수 모두 입력한 코드는 원하는 대로 한 줄만 나왔네요. 두 번째 줄은 신규회원 이름에 "신규가입"을 주었습니다. 그런데 가입된 회원이 맨 윗줄에 출력되었네요? 그 이유는 this()로 맨 위 생성자도 호출해줬기 때문입니다. 맨 아랫줄도 마찬가지입니다. 우리에 목적은 결국은 인스턴스 변수에 값을 넣는것입니다. 맨 위에서는 모든 인스턴스변수에 값을 대입하고 있습니다.(this.pointNum = pointNum) 그렇게 때문에 맨 위 한번, 해당 생성자 한번 이렇게 출력되는 겁니다!
this: 인스턴스 자신을 가리키는 참조 변수. 인스턴스 주소가 저장되어있음.
this(), this(Parameter): 생성자, 같은 클래스의 다른 생성자를 호출할 때 사용한다.
그럼 한 번만 출력하고 싶으면 어떻게 할까요? 저는 매개변수를 안 넘겨줄 때 각각 비회원, 0000, 0 이 출력되었으면 좋겠습니다.
맨 아래줄 코드를 다음과 같이 바꿔봅시다.
Point() {
// this("비회원", 0000, 0);
this.userName = "비회원";
this.pointNum = 0000;
this.pointValue = 0;
System.out.printf("비회원:%s" + " pointNumber:%d" + " pointValue: %d\n", userName, pointNum, pointValue);
}
>>> 비회원:비회원 pointNumber:0 pointValue: 0
한 가지 더 주의해야 할 점은 this는 인스턴스 멤버만 사용할 수 있습니다. static메서드(클래스 메서드)에서는 인스턴스 멤버를 사용하지 못하는 것처럼, this도 사용이 불가합니다. static메서드는 인스턴스를 생성하지 않고도 호출될 수 있으니깐요.
좀 더 자세히 설명하면 인스턴스 변수는 인스턴스화 되어야 사용이 가능합니다. 언제 생성이 될지 알 수가 없죠. 반면에 클래스 변수는 클래스가 로딩되는 즉시 바로 사용이 가능합니다! 메서드도 동일해요 언제 생성될지 모르는 친구를 클래스가 로딩되면 바로 사용되어야 할 메서드에 사용하면 안 되겠죠?
static에 대해 더 자세히 알고 싶으면 제 블로그를 참고하세요!
맨날 헷갈리는 자바 1편 - 변수(인스턴스, 클래스(static))편
안녕하세요! 그동안 공모전이랑 알바 등으로 바빠서 오래간만에 글을 써 보는 거 같네요! 얼마 전에 아버지 회사 홈페이지 리뉴얼을 담당하게 되었어요! 드디어 자바서버를 실제 서비스에 배포
ppangdev.tistory.com
오늘은 이렇게 this, this()에 대해 알아봤습니다. 실무에서는 쓰던 거만 쓰다 보니깐 특히 this메서드()를 가장 많이 까먹는데요. 이렇게 정리해두면 나중에 저도 찾아보기 쉽고 여러분들에게도 도움이 되었음 해서 적어봤습니다! 오늘도 즐코하세요!