[20230717] 클라우드 플랫폼 기반 웹서비스 개발자 양성 과정 8일차.

양희정·2023년 7월 17일
0

오늘의 과정 목록
-객체지향 프로그래밍의 특성, 상속, 캡슐화, 추상화, 다형성
(상속, 오버라이딩)

객체지향 프로그래밍의 특성, 상속, 캡슐화, 추상화, 다형성

객체지향 프로그래밍의 특성, 상속, 캡슐화, 추상화, 다형성은 코드의 재사용성을 높이고 모듈화가 가능하게 만들고 유지보수를 수월하게 한다.

상속

  • 객체 지향 프로그래밍의 핵심 원칙 중 하나로, 하나의 클래스가 다른 클래스의 속성과 메서드를 받아들이거나 "확장"하는 메커니즘을 의미한다.
  • 이를 통해 코드 재사용, 확장성, 유지 보수가 용이한 설계를 가능하게 한다.
  • Superclass (Parent Class) : 상속 해주는 클래스
  • Subclass (Child Class) : 상속을 받는 클래스
  • 상속 Tip
    • 객체지향특성을 활용할 때 모듈화를 많이 하면 더 복잡해질 수 있기 때문에 중간 지점을 찾아 사용하는 것이 좋다.
    • 자주 사용하는 속성과 메서드가 아니라면 상속을 사용하지 않는다.
    • 공통된 속성을 사용하기 위해서 상속하지 않는다.
    • 원래 있는 코드를 "확장"하여 새로운 코드를 만들거나 추가할 때 사용한다.

일반 클래스 예문

Class Teacher {
	String name;
    int age;
    String address;
    String school;
    int gradeClass;
    
    void eat(String food) {
    	System.out.println(food + "을/를 먹는다.");
    }
    void teaching() {
    	System.out.println(gradeClass + "에서 밥을 먹습니다.")
    }
} 

class Police {
	String name;
	int age;
	String address;
	String position;
	String area;
	
	void eat(String food)  {
		System.out.println(food + "을/를 먹는다.");
	}
	
	void patrol() {
		System.out.println(area + "을/를 순찰합니다.");
	}
}
public class Inheritance {
	public static void main(String[] args) {
    
    	Teacher teacher = new Teacher();
        teacher.name = "선생님1";
		teacher.school = "한국고등학교";
		System.out.println(teacher.name);
        
    }
}    
/*
출력 결과)
선생님1
*/

상속
클래스 Teacher와 클래스Police의 공통 인스턴스를 상속할 부모 클래스 Human을 만들어 상속 받기

class Human {
	String name;
	int age;
	String address;
    
    void eat() {
		System.out.println("음식을 먹는다.");
	}
}

class Teacher extends Human {
	String school;
	int gradeClass;
 
	void eat() {
		System.out.println(school + "에서 밥을 먹습니다.");
	}
	
	void eat(String food) { 
		System.out.println(school + "에서 " + food + "을/를 먹습니다.");
	}
} 
 
public class Inheritance {

	public static void main(String[] args) {
		Teacher teacher = new Teacher();
		Human human = new Human();
		teacher.name = "선생님1";
		teacher.school = "한국고등학교";
		System.out.println(teacher.name);
		
		human.eat();
		teacher.eat();
		teacher.eat("밥");

	}
}
/*
출력 결과)
선생님1
음식을 먹는다.
한국고등학교에서 밥을 먹습니다.
한국고등학교에서 밥을/를 먹습니다.
*/

단일상속

  • 한 클래스가 하나의 상위 클래스만 상속받을 수 있다는 것을 의미하며 여러 개의 클래스로부터 상속받는 것을 허용되지 않는다.
  • 다중 상속의 복잡성과 문제를 방지하는 데 도움을 준다.
  • 다른 클래스를 2개 이상 상속받았을 때 동일한 메서드가 존재한다면 둘 중에 어떤 것을 호출할지 모르는 문제가 생기는 다이아몬드 문제가 생길 수 있다.

super / super()

  • 하위 클래스에서 상위 클래스의 필드나 메서드에 접근하는 데 사용된다.
class Human {
	String name;
	int age;
	String address;
	
	Human(String name, int age, String address) {
		this.name = name;
		this.age = age;
		this.address = address;
	}
	
	void eat() {
		System.out.println(name + "선생님은" + "음식을 먹는다.");
	}
}

class Teacher extends Human {

	String school;
	int gradeClass;
	
	Teacher(String name, int age, String address, String school, int gradeClass) {
		super(name, age, address);
		this.school = school;
		this.gradeClass = gradeClass;
	}
	void teaching() {
		System.out.println(gradeClass + "반에서 수업을 한다.");
	}
	void eat() {
		System.out.println(school + "에서 밥을 먹습니다.");
	}
	
	void eat(String food) {
		System.out.println(school + "에서 " + food + "을/를 먹습니다.");
	}
}    

public class Inheritance {

	public static void main(String[] args) {
		Teacher teacher = new Teacher("김철수", 50, "사회", "한국중학교", 1);
		Human human = new Human("김영희", 30, "수학");
		System.out.println(teacher.name);
		
		human.eat();
		teacher.teaching();
		teacher.eat();
		teacher.eat("밥");

	}
}
/*
출력 결과)
김철수
김영희선생님은음식을 먹는다.
1에서 수업을 한다.
한국중학교에서 밥을 먹습니다.
한국중학교에서 밥을/를 먹습니다.
*/

오버라이딩

  • 하위 클래스가 상위 클래스의 메서드를 재정의 하는 과정을 의미한다.
  • 폐쇠원칙을 지키면서 수정을 가능하게 해준다.
  • 상위 클래스에 정의된 메서드와 동일한 이름, 매개변수 및 반환 타입을 가진 메서드를 하위 클래스에서 다시 정의 할 수 있다.

오버라이딩 규칙

  • 메서드 이름, 매개변수 리스트, 반환 타입은 상위 클래스으 메서드와 동일해야 한다.
  • 상위 클래스의 메서드가 final로 선언되어 있으면 오버라이딩할 수 없다.

@Override 어노텡션

  • 하위 클래스의 메서드가 상위 클래스의 메서드를 오버라이딩하고 있음을 나타내는 데 사용한다.
  • 컴파일러에게 이 메서드가 오버라이딩 메서드임을 명시적으로 알려준다.
  • 만약 오버라이딩의 규칙을 준수하지 않을 경우, 컴파일러가 오버라이딩을 하는지 구분할 수 없기 때문에 에러로도 표기되지 않는다.

오버라이딩의 장점

  • 코드의 유연성
    하위 클래스는 상위 클래스의 메서드를 재정의(오버라이딩)하여 자신의 특성에 맞게 동작을 변경할 수 있다. 이를 통해 메서드 호출에 대해 다양한 동작을 구현할 수 있다. 이러한 특성은 다형성의 중요한 요소이다.
    + 오버로드, 오버라이딩이 다형성을 제공한다.

오버로드와 오버라이딩

오버로드 : 같은 이름의 메소드를 여러개 만드는 것.
오버라이딩 : 부모 클래스에 있는 메서드를 재정의 하는 것.

class Human {
	String name;
	int age;
	String address;
	
	void eat() {
		System.out.println("음식을 먹는다.");
	}
}
class Police extends Human{
	String position;
	String area;
	
    // 오버라이딩 
	@Override
	void eat() {
		System.out.println(name + " 경찰관은" + " 음식을 먹는다.");
	}
	
    // 오버로드
	void eat(String food)  {
		System.out.println(food + "을/를 먹는다.");
	}
}

public class Inheritance {
	public static void main(String[] args) {
    
		Police police = new Police();
		
		police.name = "이훈이";
		police.area = "떡잎마을";
		System.out.println(police.name);
		System.out.println(police.area);
		
		police.eat();
		police.eat("밥");

	}
}

/*
출력 결과)
이훈이
떡잎마을
이훈이 경찰관은 음식을 먹는다.
밥을/를 먹는다.
*/

0개의 댓글