하도 오랜만에 자바하니까 객체지향 다 까먹어버려서 다시 정리
클래스는 표현하고자하는 대상의 공통 속성을 모아놓은 것임.
속성으로는 멤버 변수, 메서드 가 있을 수 있음
인스턴스는 클래스를 기반으로 만들어지는 객체를 뜻함
흔한 예로 붕어빵과 붕어빵 틀이 잇으면 붕어빵이 객체 즉 인스턴스이고, 붕어빵 틀이 클래스임 붕어빵마다 모양은 같지만 안에 앙금이 다를 수 있음.
쉽게 생각해서 작업이라고 생각하면 좋음. 비슷한 활동을 묶어놓는 거임.
이름 규칙
- 클래스 : 명사형으로 작성하는 것이 좋음. 파스칼 규칙을 따름. 파스칼이란 단어의 첫글자를 전부 대문자로 작성하는 것 ex) FileEntity
- 메서드: 동사형으로 작성하는 것이 좋음. camel 규칙을 따름.
첫 문자는 소문자, 다음에 나오는 단어의 첫글자는 대문자로 작성하면 됨
ex) findBomb
생성자는 초기화 메서드라고 생각하면 좋음. 객체를 생성할 적에 new 키워드 뒤에 호출됨.
public static void main(String[] args) {
Dog dog = new Dog("코코", "허스키");
dog.cry();
상속은 클래스를 재사용한다고 생각하면 좋음. 상속받은 클래스는 부모 클래스에서 변경된 부분만 따로 정의해줌
예시
Bird.java
public abstract class Bird {
int x, y, z;
void fly(int x, int y, int z){
this.x = x;
this.y = y;
if (flyable(z)){
this.z = z;
}
else System.out.println(z + " 높이로는 날 수 없습니다.");
printLocation();
}
Peacock.java
public class Peacock extends Bird{
@Override
public boolean flyable(int z) {
return false;
}
}
super 메서드
부모 클래스에 있는 필드나 메소드, 생성자를 자식 클래스에서 참조하여 사용하고 싶을 때 사용하는 키워드임.
오버로딩
한 클래스 내에 같은 이름의 메서드를 여러개 정의하는 것
메서드 이름이 같지만, 매개변수의 개수나 타입이 달라야함
오버라이딩
부모 클래스로부터 상속받은 메서드를 재정의하는 경우
하나의 객체가 여러가지 형태를 가질 수 있는 겂을 의미함.
우리가 많이 볼 수 있는 객체 타임과 참조 변수 타입이 일치하는 경우와 다르게 불일치하는 경우이다. 예시와 함께 보자
static class Animal {
String name;
Animal(String name){
this.name = name;
}
public void cry(){
System.out.println(name + "is crying");
}
public void walk(){
System.out.println(name + " is walking");
}
}
static class Giraffe extends Animal {
Giraffe(String name) {
super(name);
}
@Override
public void cry() {
super.cry();
System.out.println(name + " cannot cry.");
}
}
// Animal giraffe = new Giraffe("기린"); 부모 클래스의 메서드만 접근 가능
// Giraffe giraffe = new Giraffe("기린"); 자식 클래스 부모클래스 메서드 모두 접근가능
// Giraffe giraffe = new Animal("기린"); 컴파일 오류
Animal giraffe = new Giraffe("기린"); //1)
Giraffe giraffe1 = new Giraffe("기린2"); //2)
코드를 보면 1번은 불일치, 2번은 일치하는 경우이다.
1번은 참조 변수가 상의 클래스인 Animal, 객체의 타입은 giraffe가 되는 것이다. 이를 활용하면 개별적인 클래스에 대한 함수나 코드를 구현하지 않고, 변수의 타입을 통일할 수 있다. 다만, 실 객체타입은 이제 자식의 클래스인 것이다.
접근 제어자는 말그대로 외부에서의 접근을 제한하는 것이다.
접근제어자는 외부로부터의 데어터 부적절한 사용을 보호하기 위한 캡슐화를 도와주는 도구임.
추상 클래스는 추상 메서드를 선언한 클래스라고 생각하면 됨.
추상 메서드는 abstract 리턴타입 이름(매개변수); 이런식으로만 정의된 메서드임. 구현은 상속받는 클래서에서 정의되어야함.
인터페이스는 객체의 특정 행동의 특징만 정의하고 구현은 implements한 클래스에서 하는 것임.
구현과 마찬가지로 리턴타입 메서드 이름만 정의함.
인터페이스는 변수는 static final만 사용가능, 접근제어자는 무조건 public이라 따로 선언하지도 않는다. 추가적으로 다중 implements가 가능하다.
인터페이스는 구현하려는 객체의 동작을 명세한다는 느낌이 강하다면, 추상클래스는 클래스를 상속받아 이용 하고 확장을 위한다고 생각하면 됨.