객체들 간의 상호작용을 통해 프로그래밍하는 방식
객체의 내부 상태와 행동 하나의 클래스로 묶고 외부로부터 숨기는 과정
정보 은닉공통된 속성과 메소드를 재사용하는 방법
하나의 단어가다른 여러 의미를 갖는 것
class Animal {
public void makeSound() {
System.out.println("Animal sound");
}
}
class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("Woof");
}
}
class Cat extends Animal {
@Override
public void makeSound() {
System.out.println("Meow");
}
}public class Main {
public static void main(String[] args) {
Animal animal1 = new Dog();
Animal animal2 = new Cat();
}
}
구체적인 것을 덜 구체적인 것으로 만드는 것
클래스 자체를 정의하는 행위인터페이스 또는 부모 클래스를 정의하는 행위
유지 관리및확장이 가능한 프로그램을 만들기 위한 원칙
SRP (Single Responsibility Principle)하나의 클래스는 하나의 책임만 있어야 한다는 원칙
OCP (Open/Closed Principle)클래스가 확장에는 열려 있고, 수정에는 닫혀있어야 한다는 원칙
다형성LSP (Liskov Substitution Principle)하위 클래스의 객체가 상위 클래스 객체를 대체할 수 있어야 한다는 원칙
ISP (Interface Segregation Principle)클라이언트가 사용하지 않는 메소드에 의존하도록 강요되면 안된다는 원칙
DIP (Dependency Inversion Principle)클라이언트가 특정
구현체가 아닌 추상화(인터페이스)에 의존해야 한다는 원칙
다형성필드
인스턴스 변수
메소드 밖, 클래스 안에 정의된 변수
static 메소드를 제외한 나머지 클래스 내부클래스 변수
인스턴스 변수에 static이 붙은 변수
매개 변수
메소드에 넘겨주는 변수
지역 변수
중괄호 내에 선언된 변수
초기화를 해줘야 함메소드
생성자
접근 제어자public누구나 접근 가능protected같은 패키지or 상속받은 경우 접근 가능default)같은 패키지 내 접근 가능private 해당 클래스 내 접근 가능transient = 일시적인, 잠깐 머무르는class Person implements Serializable {
private String name;
private transient int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
public class Main {
public static void main(String[] args) throws Exception {
Person p = new Person("John", 30);
// Serialize the object
FileOutputStream fileOut = new FileOutputStream("person.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(p);
out.close();
fileOut.close();
// Deserialize the object
FileInputStream fileIn = new FileInputStream("person.ser");
ObjectInputStream in = new ObjectInputStream(fileIn);
Person p2 = (Person) in.readObject();
in.close();
fileIn.close();
// Output the deserialized object
System.out.println("Name: " + p2.getName());
System.out.println("Age: " + p2.getAge());
}
}Name: John
Age: 0synchronizedvolatilestatic 블록, 인스턴스 블록을 사용하는 이유공통으로 처리해야하는 작업이 있으면 코드를 줄일 수 있고 유지보수 하기가 쉬워짐클래스 안에 클래스가 들어가 있는 것
Static nested classInner class - 내부 클래스Anonymous inner class - 익명 클래스메모리 누수를 방지할 수 있음외부클래스.static내부클래스OuterOfStatic.StaticNested staticObject = new OuterOfStatic.StaticNested();내부 클래스가 외부 클래스를 참조함OuterOfInner outer = new OuterOfInner(); // 외부 클래스 객체 먼저 생성
OuterOfInner.Inner inner = outer.new Inner(); // 외부 클래스 객체를 사용해 생성자 호출매개변수로 인터페이스를 받는 경우 인터페이스를 구현한 클래스를 따로 만들지 않고 익명의 클래스 객체를 만들어 메소드를 구현하는 것interface A {
void methodA();
}
public class Main {
static void methodB(A a) { // 매개변수로 인터페이스를 받는 메소드
a.methodA(); // 인터페이스의 메소드를 사용
}
public static void main(String[] args) {
methodB(new A() { // 매개변수로 인터페이스를 구현한 익명클래스를 받음
@Override
public void methodA() {
System.out.println("hi");
}
}); // ; 붙여줘야 함
}
}
public static void main(String[] args) {
OneMethodInterface implObject = new ImplClass();
OneMethodInterface implObject2 = new ImplClass2();
OneMethodInterface implObject3 = new OneMethodInterface() {
@Override
public void hi() {
System.out.println("hihihi");
}
};
OneMethodInterface implObject4 = () -> System.out.println("hihihihi");
implObject.hi(); // hi
implObject2.hi(); // hihi
implObject3.hi(); // hihihi
implObject4.hi(); // hihihihi
}
메모리 사용도 줄이고 시간도 줄일 수 있기 때문에 사용
참조 가능한 변수가 다름
Static nested classInner class & Anonymous class외부 클래스맨 마지막에만 사용해야함한번만 사용 가능함public static void print(String... data) {
for (String s : data) {
System.out.println(s);
}
}print("Hello"); // Hello
print("Hello", "World"); // Hello World
print("Hello", "World", "Java"); // Hello World Java메소드 시그니처메소드 이름 + 매개변수의 조합 (매개변수 갯수, 순서, 타입)리턴타입은 메소드 시그니처에 포함되지 않음❗ 오버라이딩
동사/전치사로 시작함메소드 이름으로 자주 사용되는 동사modifier
study/java/whiteship-study/5week at main · ByungJun25/study
Reference type parameter, nested class
TIL/java/live-study/05. 클래스 at master · hypernova1/TIL
클래스 메소드의 사용
java 클래스 실행 순서
메소드 명명법, getter/setter 주의사항
내부 클래스 사용 → 캡슐화!