extends
키워드를 사용하며, 클래스명 다음에 extends 상위 클래스명
을 사용하여 정의class Person {
String name;
int age;
void walk(){
System.out.println("걷습니다.");
};
void eat(){
System.out.println("밥을 먹습니다.");
};
}
class Dancer extends Person { // Person 클래스로부터 상속
String groupName;
void dancing(){
System.out.println("춤을 춥니다.");
};
}
public class Employee {
int id;
String name;
Address address;
}
class Address {
String city, country;
}
Employee
클래스 멤버 변수로 Adress
클래스가 정의되있다.Address
클래스 내 인스턴스 변수 city, country
를 각각 Employee
클래스의 변수로 정의해야하지만, Address
클래스로 변수들을 묶어준다음 Employee
클래스 안에 참조변수를 선언하는 포함관계로 재상용 → 코드 중복 제거메서드의 선언부(메서드 이름, 매개변수, 반환타입)이 상위클래스의 그것과 완전히 일치해야한다.
접근 제어자의 범위가 상위 클래스의 메서드보다 같거나 넓어야 한다.
예외는 상위 클래스의 메서드보다 많이 선언할 수 없다.
class Vehicle {
void run() {
System.out.println("Vehicle is running");
}
}
public class Bike extends Vehicle { // Vehicle 클래스 상속
void run() {
System.out.println("Bike is running"); // 메서드 오버라이딩
}
// 출력값 : "Bike is running"
Bike bike = new Bike(); // 각각의 타입으로 선언 + 각각의 타입으로 객체 생성
Car car = new Car();
MotorBike motorBike = new MotorBike();
Vehicle bike2 = new Bike(); // 상위 클래스 타입으로 선언 + 각각 타입으로 객체 생성
Vehicle car2 = new Car();
Vehicle motorBike2 = new MotorBike();
// 배열로 한번에 관리하기
Vehicle[] vehicles = new Vehicle[] { new Bike(), new Car(), new MotorBike()};
for (Vehicle vehicle : vehicles) {
vehicle.run();
}
super
키워드는 상위 클래스의 객체의 멤버 값을 참고super()
는 상위 클래스의 생성자를 호출최상위 클래스
자바의 모든 클래스는 Object 클래스로부터 확장된다
컴파일러는 아무런 상속을 받지 않는 클래스에 자동적으로 extends Object
를 추가
Object 클래스는 자바 클래스의 상속계층도에 가장 위에 위치하기 때문에 Object 클래스의 멤버들을 자동으로 상속받아 사용가능
Object 메서드
toString() | String | 객체 정보를 문자열로 출력 |
---|---|---|
equals(Object obj) | boolean | 등가 비교 연산(==)과 동일하게 스택 메모리값을 비교 |
hashCode() | int | 객체의 위치정보 관련. Hashtable 또는 HashMap에서 동일 객체여부 판단 |
wait() | void | 현재 쓰레드 일시정지 |
notify() | void | 일시정지 중인 쓰레드 재동작 |
점(.)
으로 표현import 패키지명.클래스명;
import 패키지명.*;
→ 해당 패키지내 모든 클래스 import
접근 제어자 | public, protected, (default), private |
---|---|
기타 제어자 | static, final, abstract, native, transient, synchronized 등 |
접근 제어자 | 접근 제한 범위 |
---|---|
private | 동일 클래스에서만 접근 가능 |
default | 동일 패키지 내에서만 접근 가능 |
protected | 동일 패키지 + 다른 패키지의 하위 클래스에서 접근 가능 |
public | 접근 제한 없음 |
private
접근제어자가 포함되어 있는 객체의 변수의 데이터 값을 추가하거나 수정하고 싶을 때set-
을 붙여서 정의get-
을 메서드명 앞에 붙여서 사용public class GetterSetterTest {
public static void main(String[] args) {
Worker w = new Worker();
w.setName("김코딩");
w.setAge(30);
w.setId(5);
String name = w.getName();
System.out.println("근로자의 이름은 " + name);
int age = w.getAge();
System.out.println("근로자의 나이는 " + age);
int id = w.getId();
System.out.println("근로자의 ID는 " + id);
}
}
class Worker {
private String name; // 변수의 은닉화. 외부로부터 접근 불가
private int age;
private int id;
public String getName() { // 멤버변수의 값
return name;
}
public void setName(String name) { // 멤버변수의 값 변경
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
if(age < 1) return; //setter 메서드내 조건에 맞을경우 데이터값 변경가능
this.age = age; // 조건에 안맞을경우 데이터값 저장하지 않고 return.
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}