객체지향심화
객체지향심화를 배우면서 많은 것을 배우고 느끼게 되었다. 객체지향심화에는 상속, 다형성, 추상화, 캡슐화가 대표적인 주제였다. 대학시절 자바응용을 배우면서 배운 내용이긴 하지만 중요하게 생각하지 않아 대충 보고 넘기게 되었었다. 하지만 이번 객제치향심화를 배우면서 내가 잘 못된 객체지향코딩을 하고 있었구나 하고 깨닫게 되었다. 객체지향에 있어 위의 4가지 키워드는 매우 중요했으며 객체지향적 프로그램 관리를 하기위해서 꼭 필요한 키워드이다.
상속
쉽게 말해 물려 받는다.
class Person {
String name;
int age;
void learn(){
System.out.println("숨을 쉰다");
};
void walk(){
System.out.println("공부한다.");
};
void eat(){
System.out.println("밥을 는다.");
};
}
class Programmer extends Person {
String companyName;
void coding(){
System.out.println("코딩 lEt'S gO !! ");
};
}
Programmer programmer = new Progammer();
programmer.walk();
programmer.eat();
부모 클래스의 변수, 메서드 모두 사용 가능.
단, 상속은 단일 상속만 가능 // 부모는 한명
super() 부모 생성자 호출
-생성자 안에서만 사용가능
-반드시 첫 줄에 와야됨
super() 예제
Student s = new Student(20);
class Human {
int age;
Human(int age) {
System.out.println("휴먼 클래스 생성자");
this.age = age;
}
}
class Student extends Human { // Human 클래스로부터 상속
Student(int age) {
super(age);
//super(); // Human 클래스의 생성자 호출
System.out.println("학생 클래스 생성자");
}
}
super(age)를 왜 하느냐
부모가 있기 전에는 자식이 존재 하지 않는다.
위 코드에서 Student 클래스 객체를 생성했는데 Student는 Humen 부모를 상속 하고 있기에 부모 클래스가 생성이 되어야 된다. 그래서 Student 객체가 생성이 될때 생성자에서 부모 생성자를 호출하여 부모클래스를 생성 해준다.
다형성
-쉽게 말해서 하나의 클래스로 다양한 인스터를 생성 할 수 있다.
Ex) Person teacher = new Teacher(), << 업케스팅 >> // 단 Teacher 클래스가 Person 클래스를 상속한다는 가정하에
Person police = new Police()
<<업케스팅>> 변수는 상위클래스인데 인스턴스는 하위클래스인 경우를 말하며 이러한 경우 상위 클래스에 있는 변수랑 메서드에만 접근이 가능하다. 하위 클래스 메서드, 변수 접근 불가능. 단, <<오버라이딩>>된 메서드는 하위클래스로 접근이 된다.
<<업케스팅>> Person teacher = (Person)new Police(); // (Person) 생략 가능
<<다운케스팅>> Police polce = (Police)teacher; // (Police) 생략 불가능
<<오버라이딩>> 부모 클래스에 있는 메서드를 자식 클래스로 가져와서 내용을 바꿀수 있다. 부모 클래스에 있는 메서드의 리턴타입 , 이름, 매개변수가 같아야 한다.
class Person
{
public void live()
{
System.out.println("사람이 숨을 쉰다.");
}
}
class Teacher extends Person
{
@Override
public void live()
{
System.out.println("선생이 숨을 쉰다.");
}
public void teach()
{
System.out.println("가르치다");
}
}
Person teacher = new Teacher()
teacher.live(); // 자식클래스의 메서드가 실행이 된다.
teacher.teach(); // 불가능
오버라이딩은 자식클래스에 선언된 부모 메서드의 리턴타입, 이름, 매개변수가 같아야 한다. 하지만 리턴타입이 다른 경우 부모가 같다면 오버라이딩 성립.
class Person
{
public Object display(String obj)
{
System.out.println("Base.display() " + obj);
return "0";
}
}
class Teacher extends Person
{
@Override
public String display(String obj)
{
System.out.println("Derived.display() " + obj);
return "Derived";
}
}
다형성을 쓰는 이유
다양한 객체를 하나의 객체를 통해 관리하여 중복되는 코드를 줄이고 보다 편리하게 코드를 작성하는 것이 가능해지기 때문이다.
<<오버로딩>>
부모 클래스의 메서드의 이름만 같고 매개변수와, 반환타입은 달라도 된다.
같은 메서드에서 다양한 기능들이 나옴 -> Ex ) System.out.println() = ()안에 int를 넣어도 되고 String, float 다 가능? ㅇㅋ
추상화 (미완성)
abstract
abstract class Animal { // 추상 메서드가 최소 하나 이상 포함돼있는 추상 클래스
abstract void sound(); // 메서드 바디가 없는 추상메서드
}
위 코드처럼 미완성된 코드를 추상클래스, 추상메서드라고 한다.
추상 클래스는 객체생성 불가능 -> 자식클래스에서 상속만 가능 -> 상속을 해서 꼭 부모의 추상 메서드를 구현해야 됨
상속 관계에 있어 새로운 클래스를 작성하는데 매우 유용
1. 동물이라면 기본적으로 있어야되는 소리 메서드
2. 개발자 누군가가 참새 클래스를 만들고 동물 추상클래스를 상속받는다.
3. 추상클래스를 상속 받음으로써 어떤걸 필수로 구현해야되는지 찾지않아도 추상 클래스에 필수적으로 작성해야 하는 추상메서드를 구현해야 하기 때문에 수고를 덜어준다.
interface // 밑그림, 추상 클래스보다 더 추상적임 , 다중구현이 가능
추상 클래스와의 차이점은
추상 클래스는 메서드 바디가 없는 추상 메서드를 하나 이상 포함한다는 점 외에는 기본적으로 일반 클래스와 동일하다고 할 수 있다.
하지만 interface는 기본적으로 추상 메서드와 상수만을 멤버로 가질 수 있다는 점에서 추상 클래스에 비해 추상화 정도가 더 높다고 할 수 있다.
캡슐화
- 정보은닉
- getter/setter
- 접근 제어자 ( public , protected, default , private )
캡슐화란 특정 객체 안에 관련된 속성과 기능을 -> 하나의 캡슐로 만든다.
데이터를 외부로부터 보호하는 것을 말합니다.
추가
얕은 복사 , 깊은 복사
얖은 복사 // 주소값만 받아와 같은 주소를 사용
public void shallowCopyExample(Product product) {
Product newProduct = product;
}
깊은 복사 // 내용은 같지만 참조값이 다름
public void DeepCopyExample(Product product) {
Product newProduct = new Product(product.getId, product.getName, ...);
}
중요
의존성 주입 (DI = Dependency Injection)
지금 까지 객체지향을 배우고 객체지향 심화에서는 다형성, 상속, 추상화, 캡슐화를 배우게 되었다. 그렇다면 왜 객체지향을 배우면서 위 4가지와 같은 다양한 기능들을 배워야 할까?
결론적으로 의존성 주입을 구현하기 위함이다.
의존성 주입이란 쉽게 말해서 철저한 역할 분리!!
-> 컴퓨터
모니터 , 본체, 키보드, 마우스가 있습니다. 이들은 아주 좋은 의존성 주입이다. 키보드가 고장나더라도 키보드만 고치고 연결잭을 본체에만 연결하면 된다. 이 처럼 키보드가 고장나거나 키보드를 바꾸게 되어도 본체에서는 아무런 수고나 변경을 안해도 된다는 것이다. 이러한 개념을 코드에 옮기는게 의존성 주입이다.
'부트캠프 > 코드스테이츠 백엔드부트캠프 43기' 카테고리의 다른 글
코드스테이츠 백엔드 부트캠프 43기 (14,15일차-컬렉션 회고) (2) | 2023.01.05 |
---|---|
코드스테이츠 백엔드 부트캠프 43기 (13일차-버거퀸 프로젝트 회고) (2) | 2023.01.02 |
코드스테이츠 백엔드 부트캠프 43기 (9일차-객체지향 회고) (0) | 2022.12.27 |
코드스테이츠 백엔드 부트캠프 43기 (8일차-Java 회고) (0) | 2022.12.26 |
코드스테이츠 백엔드 부트캠프 43기 (7일차-Java 회고) (0) | 2022.12.23 |
댓글