super 키워드는 상속 받고 있는 부모 객체를 지목할 때 사용하는 키워드
super.
을 통해서 부모의 필드나 메서드를 지목할 수 있고, super()
를 통해package day08.super_;
public class Parent {
// 필드 : 객체의 속성 - 성질, 데이터, 명사
int a;
double b;
// 생성자 : 객체가 생성될 때 초기화
Parent() {
super(); // Object
System.out.println("Parent 클래스 생성자 호출!");
this.a = 15;
this.b = 20.5;
}
// 메서드 : 객체의 기능 - 행위, 행동, 동사
void superMethod() {
System.out.println("parent a = " + this.a);
System.out.println("parent b = " + this.b);
}
}
package day08.super_;
public class Child extends Parent {
int a;
double b;
boolean c;
Child() {
this(100);
System.out.println("Child 클래스의 생성자 호출!");
this.c = true;
}
Child(int x) {
super();
System.out.println("Child 클래스의 2번째 생성자 호출!");
}
void childMethod() {
System.out.println("child a = " + this.a);
System.out.println("child b = " + this.b);
System.out.println("child c = " + this.c);
}
}
package day08.super_;
public class Main {
public static void main(String[] args) {
Child c = new Child();
// c.superMethod(); // a = 15, b = 20.5
c.childMethod(); // a = 0, b = 0.0
}
}
(단, this()가 존재한다면 super()가 올 수 없음)
-> 부모 클래스의 기본생성자 호출 -> 출력값이 있으면 출력되고 a = 15, b = 20.5로 초기화된다.정적(static)은 ‘고정된’ 이란 의미를 가지고 있다.
정적 필드
, 메서드는 정적 메서드
라고 칭한다.인스턴스 필드
, 메서드는 인스턴스 메서드
이다.모든 객체가 공유되며 객체 생성없이 접근 가능
static
필드는 선언된 클래스의 이름을 통해 바로 참조할 수 있다.package day08.static_;
public class Count {
// 사용 제한자(usage modifier)
static int x; // 정적 필드 : 모든 객체가 공유
int y; // 인스턴스 필드 : 각 객체별로 따로 관리
// 정적 메서드 : 모든 객체가 공유하며 객체 생성없이 접근 가능
static void m1() {
System.out.println("static method call!");
System.out.println("x (static) = " + x);
// static 메서드 내부에서는 instance필드와 메서드를 직접 참조할 수 없다.
// static은 객체생성없이 호출되므로 this를 가질 수 없기 때문에
// System.out.println("y (instance) = " + y);
}
// 인스턴스 메서드 : 각 객체별로 따로 실행됨
void m2() {
System.out.println("instance method call!");
System.out.println("x (static) = " + x);
System.out.println("y (instance) = " + y);
}
}
Count c1 = new Count();
c1.a += 5;
c1.b += 5;
System.out.println("인스턴스 변수 c1.a: " + c1.a); //5
System.out.println("정적 변수 c1.b: " + c1.b); //5
Count c2 = new Count();
c2.a += 7;
c2.b += 7;
System.out.println("인스턴스 변수 c2.a: " + c2.a); //7
System.out.println("정적 변수 c2.b: " + c2.b); //12
Count c3 = new Count();
c3.a += 8;
c3.b += 8;
System.out.println("인스턴스 변수 c3.a: " + c3.a); //8
System.out.println("정적 변수 c3.b: " + c3.b); //20
System.out.println("정적 변수 c1.b: " + c1.b); //20
System.out.println("정적 변수 c1.b: " + c2.b); //20
package day08.static_;
public class Person {
String name;
int age;
static String nation; // 국가
// 정적 초기화자 (static initializer)
// static필드의 생성자같은 역할 (static필드 초기화담당)
static {
nation = "대한민국";
}
Person(String name, int age) {
this.name = name;
this.age = age;
// nation = "대한민국"; // this를 가질 수 없기 때문에 그냥 들어감
}
}
Math.random()
의 Math도 생략가능하고, 출력할 때 쓰는 System.out.println()
에서 System도 생략 가능!! SimpleInput si = new SimpleInput();
String name = Si.input("이름: ");
// static을 사용하면 객체생성을 안해도 사용가능해서 편리함
// import static day06.util.SimpleInput.input; 을 불러옴으로써
// String name = SimpleInput.input("이름: "); 에서 SimpleInput 생략가능
String name = input("이름: ");