티스토리 뷰
[자바의 정석] Ch 7-10 참조변수 super란? Ch 7-12 패키지(package)란? Ch 7-16 static import문이란?
da_devel 2022. 6. 21. 03:10
🤔 참조변수 super란?
✔ 객체 자신을 가리키는 참조변수. 인스턴스 메서드(생성자) 내에서만 존재
✔ 조상의 멤버를 자신의 멤버와 구별할 때 사용
🤔 this와 super의 차이점?
this : 지역변수(local variable)와 인스턴스 변수(instance variable)의 구분에 사용
super : 조상의 멤버와 자신의 멤버 구분에 사용
다음의 예제를 보자.
class T2 {
public static void main(String[] args) {
Child c = new Child();
c.method();
}
}
class Parent { int x = 10; /** super.x */ }
class Child extends Parent {
int x = 20; // this.x
void method() {
System.out.println("x = " + x);
System.out.println("this.x = " + this.x);
System.out.println("super.x = " + super.x);
}
}
출력결과는 다음과 같다.
x = 20
this.x = 20
super.x = 10
🤔 super() 란?
조상의 생성자
✔ 조상의 생성자를 호출할 때 사용
✔ 조상의 멤버는 조상의 생성자를 호출해서 초기화
✔ 생성자의 첫 줄에 반드시 생성자를 호출해야 한다. ⭐⭐
그렇지 않으면 컴파일러가 생성자의 첫 줄에 super();를 삽입한다.
다음의 코드를 보자.
class T2 {
public static void main(String[] args) {
Point3D p3 = new Point3D(1, 2, 3);
}
}
class Point {
int x;
int y;
Point(int x, int y) {
this.x = x;
this.y = y;
}
String getlocation() {
return "x : " + x + ", y : " + y;
}
}
class Point3D extends Point {
int z;
Point3D(int x, int y, int z) {
this.x = x;
this.y = y;
this.z = z;
}
String getLocation() { // 오버라이딩
return "x : " + x + ", y : " + y + ", z : " + z;
}
}
위 코드를 실행시키면 어떻게 될까?
문제가 있지 않은가?
코드를 실행시키면 다음과 같은 컴파일 에러가 난다.
Poitn3D(int x, int y, int z)에서 에러가 난다고 하는데
왜 에러가 나는 것일까?
위에서 말했다 싶이
✔ 생성자의 첫 줄에 반드시 생성자를 호출해야 한다. ⭐⭐
근데 24번째줄의 생성자를 생성하면서
생성자를 호출하지 않았다.
때문에 컴파일러가 자동으로 super();를 넣고 실행하는데
super()의 경우 상속받은 부모이기 때문에
위의 예시에서 Point();이다.
근데 코드에서 Point(int x, int y) 생성자만 생성해주었고
Point(){}의 기본 생성자는 생성해주지 않았다.
심지어 Point(int x, int y)의 생성자가 없었다면
컴파일러가 자동으로 default constructor를 생성해주었을 텐데
위 예제에서는 생성자가 있기 때문에 Point(){} 의 기본 생성자를 추가로 정의해야 한다.
➕ 수정된 코드를 보자.
class T2 {
public static void main(String[] args) {
Point3D p3 = new Point3D(1, 2, 3);
}
}
class Point {
int x;
int y;
Point(int x, int y) {
this.x = x;
this.y = y;
}
String getlocation() {
return "x : " + x + ", y : " + y;
}
}
class Point3D extends Point {
int z;
Point3D(int x, int y, int z) {
super(x, y);
this.z = z;
}
String getLocation() { // 오버라이딩
return "x : " + x + ", y : " + y + ", z : " + z;
}
}
다음과 같이 수정하면 된다.
🤔 패키지(package)란?
서로 관련된 클래스의 묶음
🤔 패키지의 선언
✔ 패키지는 소스파일의 첫 번째 문장으로 단 한 번 선언
✔ 같은 소스 파일의 클래스들은 모두 같은 패키지에 속하게 된다.
✔ 패키지 선언이 없으면 이름없는(unnamed) 패키지에 속하게 된다.
🤔 static import문이란?
static 멤버를 사용할 때 클래스 이름을 생략할 수 있게 해준다.
import static java.lang.Integer.*; // Ingeter클래스의 모든 static 메서드
import static java.lang.Math.random; // Math.random()만. 괄호 안붙임.
import static java.lang.System.out; // System.out을 out만으로 참조가능
// System.out.println(Math.random()); // 다음의 문장을
out.println(random()); // 다음과 같이 사용할 수 있음.
import static java.lang.Integer.*; // Ingeter클래스의 모든 static 메서드
import static java.lang.Math.PI;
import static java.lang.Math.random; // Math.random()만. 괄호 안붙임.
import static java.lang.System.out; // System.out을 out만으로 참조가능
public class T2 {
public static void main(String[] args) {
// System.out.println(Math.random());
out.println(random());
// System.out.println("Math.PI : Math.PI");
out.println("Math.PI : " + PI);
}
}
🤔 static import문 사용 이유?
코드를 단축하기 위해서!!
오늘도 열공하자. 🔥
'프로그래밍 > 자바' 카테고리의 다른 글
- Total
- Today
- Yesterday
- 디버깅
- JPA
- LinkedList
- challenges
- hackerrank challenges
- BAEKJOON
- 강의
- Java
- 그리디
- stack
- 해커랭크 자바
- 자바의 정석
- 해커랭크 자바 챌린지
- 백준
- 개발자
- 소스코드
- 22 정보처리산업기사
- 해커랭크
- ORM
- 22 정보처리 산업기사
- 코드
- 해커랭크 챌린지
- hackerrank
- 정보처리 산업기사
- 자바
- 챌린지
- 정보처리산업기사
- 정보처리산업기사 공부법
- 풀이
- queue
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |