본문 바로가기
언어공부/JAVA&SPRING

[패스트캠퍼스 수강 후기] 자바 인강 100% 환급 챌린지 10회차 미션

by hobbiz 2020. 8. 19.
반응형

 

오늘은 클래스와 객체 중 this에 대해 공부해보았다.

 

this의 역할로는

 

자신의 메모리를 가리키거나

생성자에서 다른 생성자를 호출하거나

인스턴스 자신의 주소를 반환하는 것이 있다.

 

 

 

 

자기 자신의 메모리를 가리킬 때는 아래와 같이 쓴다.

 

 

다음 강의에서는 객체 간 협력에 대해서도 공부해보았다.

 

객체 지향 프로그램은 객체를 정의하고 객체간의 협력을 구현한 프로그램이다.

학생이 지하철이나 버스를 타고 학교 가는 과정에서 일어나는 협력을 예로 들 수 있다.

 

 

 

<추가공부>

자료출처 :https://blog.naver.com/bitcoding/221449924466

 

 

this의 뜻을 정확히 알기 위해서는 먼저 클래스인스턴스에 대한 개념을 잘 알고 계셔야 하는데요, 간략히 설명드리면 클래스는 어떠한 객체, 즉 인스턴스를 만들기 위한 틀이고, 인스턴스클래스라는 틀에 의해 찍혀나온 객체들이라고 생각할 수 있습니다.

널리 알려진 비유를 들어 설명하자면, 클래스는 붕어빵 틀이고, 인스턴스는 붕어빵이라고 할 수 있습니다. 클래스라는 틀을 사용하여 인스턴스들을 만들어낼 수 있는 점을 비유한 것이죠. 이해가 되셨다면, this에 대해 알아보도록 할게요!

this는 클래스를 통해 만들어진 인스턴스(객체) 자기 자신을 지칭하는 키워드입니다. 다음과 같이 학생을 나타내는 Student class가 있다고 해봅시다.

class Student { String name; int grade; public void selfIntroduce() { System.out.println("안녕하세요 잘 부탁드립니다!"); } }

selfIntroduce 메소드가 호출되면 "안녕하세요 잘 부탁드립니다!" 문자열이 출력될 것입니다. 메소드를 호출하려면 먼저 인스턴스를 생성해야 하죠? 다음은 Student 클래스의 인스턴스를 생성하고 selfIntroduce 메소드를 호출한 코드입니다.

public static void main(String[] args) { Student s = new Student(); s.selfIntroduce(); // s 객체의 메소드를 호출 }

예상한 대로 문자열이 잘 출력되는데요, 메소드를 호출할 때 해당 메소드를 가지고 있는 객체(s)를 이용하여 호출한 것이 보이시나요? 이런 경우에는 객체의 이름(s)을 사용하여 해당 객체를 호출할 수 있습니다. 하지만 만약에 객체 내에서 자기자신을 호출해야 한다면 어떻게 해야할까요? 이때 this가 사용되는 것입니다.

this 키워드를 사용하면 클래스를 통해 만들어진 객체 자기자신을 호출할 수 있습니다. 아직은 좀 감이 안잡히나요? 아래의 예시를 보고 이해해보도록 합시다. 다음 코드는 Student 클래스를 조금 보완한 것입니다.

class Student { String name; int age; int grade; public Student(String name, int grade) { // 생성자 this.name = name; // 왼쪽의 this.name은 이 객체의 name 인스턴스 변수를, 오른쪽의 name은 생성자에 입력된 변수 name을 지칭한다. // name = name; 으로 쓰면 인스턴스 변수에 입력값이 제대로 입력되지 않음 this.grade = grade; } public void selfIntroduce() { System.out.println("안녕하세요 저는 " + this.grade +"학년 "+ this.name + "입니다. 잘 부탁드립니다!"); } //this.grade는 이 객체가 가지고 있는 grade 인스턴스 변수를 지칭. 여기서는 this 없이 grade만 써도 인식됨 }

먼저 생성자를 통해서 매개변수로 name과 grade가 입력되면 생성자 내에서 인스턴스 변수에 입력값을 대입해주고 있습니다. 여기서 this.name이라는 것은 this, 즉 객체 자기 자신의 변수 name을 의미하는 것입니다. 따라서 매개변수로 입력된 name 문자열을 인스턴스 변수 name에 입력해주는 것이지요.

만약 여기서 this.name 대신 name을 쓴다면 name = name이 되어서 양변에 있는 두 name 변수를 모두 매개변수의 name으로 인식하게 됩니다. 따라서 인스턴스 변수를 호출하지 못했으므로 제대로 값이 대입되지 않겠죠! 따라서 객체(인스턴스) 자기 자신의 변수를 호출하기 위해서는 this를 꼭 써야 합니다.

selfIntroduce() 메소드에서도 this가 쓰였는데요. 자기자신의 name 변수와 grade 변수를 자기소개하는 출력문에 사용해야 하기 때문에 이를 호출하려고 this를 쓴 것입니다. 그런데 생성자에서와 달리 헷갈릴 여지가 없다면 this를 생략해도 자바에서 this가 있는 것으로 인식하기 때문에 필수적이지는 않습니다. 즉 name, grade 으로만 써도 자바에서는 this.name, this.grade로 인식한다는 것입니다. 그렇다면 새로 바뀐 Student 클래스를 활용해보도록 할까요?

public static void main(String[] args) { Student s = new Student("김비트", 3); s.selfIntroduce(); }

이 코드를 실행하면 "안녕하세요 저는 3학년 김비트입니다. 잘 부탁드립니다!" 출력문이 정상적으로 뜹니다. this 키워드를 사용해서 객체 자기자신을 호출할 수 있고, 이를 통해서 객체의 인스턴스 변수에 접근할 수 있다는 것이 이해되시나요? 위의 예시에서는 인스턴스 변수만 호출했지만, 마찬가지의 방법으로 자기자신의 메소드 또한 호출할 수 있습니다.

덧붙이자면, this() 처럼 메소드의 형태로 쓰면 이는 객체 자기자신의 생성자를 의미하는 것도 알아두시면 좋을 것 같습니다. 이는 생성자를 오버로딩하는 경우 등에 쓰일 때가 있습니다.

그렇다면 문제를 하나 풀어보도록 할까요? 다음 문제는 <비트코딩 라이트: 자바>에 수록되어있는 문제 중 하나입니다!

this 키워드를 활용해서 문제를 풀어보시기 바랍니다.

잘 풀어보셨나요? 예시 답안은 다음과 같습니다. 완전히 같을 필요는 없지만, 참고하시길 바랍니다!

class Square { double h; double a; double area() { return this.h*this.a; } }

 

 

 

 

 

 

 

https://bit.ly/3ilMbIO

 

Java 웹 개발 마스터 올인원 패키지 Online. | 패스트캠퍼스

자바 기초문법부터 프로젝트 실습까지 Java 문법부터 스프링/스프링부트, 트렌디한 기술인 JPA까지 모두 배우는 온라인 강의입니다.

www.fastcampus.co.kr

 

 

반응형

댓글