1. 캡슐화
캡슐화는 개체의 속성과 메서드를 바인딩하는 추상화 유형입니다.
필요한 부분만 외부에 공개함으로써
불필요하게 노출할 필요가 없는 내부 구현 정보를 숨깁니다.
내 지갑을 샘플 코드로 제시합니다.
총액을 알려주는 기능과 돈을 지불하는 기능이 있습니다.
public class Wallet {
private int money;
public Wallet(int money){
this.money = money;
}
public int getTotalMoney(int price) {
return this.money;
}
private void substractMoney(int charge) {
money -= charge;
}
}
액세스 한정자는 Java에서 캡슐화를 활성화하는 데 사용됩니다.
속성에 해당하는 부분은 private로 설정하고,
지갑 안의 돈은 생성자를 이용해 초기화하고 세터와 게터만 공개하기 때문에 외부 메서드를 사용하지 않으면 내부 상태를 제어할 수 없다.
2. 추상화
추상화는 불필요한 중복을 제거하고 공통 속성 및 기능을 추상화하고 정의하는 것입니다.
이를 통해 코드를 보다 유연하게 변경할 수 있습니다.
카페 메뉴판을 가정하여 코드를 작성하였습니다.
아시다시피 카페는 메뉴가 많고 메뉴가 하나씩 추가되면서 무수한 클래스가 만들어집니다.
하지만 이 메뉴들에는 공통점이 있습니다! 메뉴 정보만 표시하면 됩니다.
이러한 공통 속성 또는 기능을 함께 그룹화하여 메뉴 호출되는 추상 클래스로 정의된 경우
어떤 메뉴를 추가하더라도 Menu 메서드를 오버라이드하고 구현하기만 하면 되겠죠?
메뉴가 비슷해도 내부적으로 구현해야 하는 부분이 다를 수 있습니다.
따라서 공통 부분만 추상화되고 세부 구현에 대한 책임은 하위 클래스로 이동됩니다.
public abstract class Menu {
void showMenu(){}
}
class Coffee extends Menu {
private String name;
private int price;
@Override
void showMenu() {
System.out.println(name);
System.out.println(price);
}
}
class Latte extends Menu {
private String name;
private int price;
@Override
void showMenu() {
System.out.println(name);
System.out.println(price);
}
}
class Juice extends Menu {
private String name;
private int price;
@Override
void showMenu() {
System.out.println(name);
System.out.println(price);
}
}
3. 다형성
다형성이란 객체의 속성이나 기능이 상황에 따라 여러 형태를 취할 수 있음을 의미합니다.
나의 현재의 경우, 나는 상황에 따라 다른 역할과 특성을 가지고 있다. B. 학교에서는 학생, 우리 집안에서는 첫째, 학계에서는 리더.
이를 구현하기 위해 메서드 재정의 및 오버로딩을 사용합니다.
우선 오버로딩은 같은 클래스가 거의 같은 기능을 가지지만 매개변수의 개수나 종류가 다른 경우이다.
메서드 이름이 메서드 이름과 같을 수 있음을 의미합니다.
public int add(int number1, int number2) {
return number1 + number2;
}
두 개의 숫자를 더하는 코드가 있다고 가정해 보겠습니다. 세 개의 숫자를 더하는 함수를 만들고 싶다면 어떻게 해야 할까요? 다시 우리는 새로운 방법을 정의할 필요가 있습니다.
public int add(int number1, int number2) {
return number1 + number2;
}
public int addForThree(int number1, int number2, int number3) {
return number1 + number2 + number3;
}
그런데 숫자 4개를 더하고 싶다면? 메서드 이름을 매번 바꿀 수는 없습니다.
따라서 Java에서는 오버로딩이라는 속성을 통해 메서드 이름을 동일하게 지정할 수 있습니다.
public int add(int number1, int number2) {
return number1 + number2;
}
public int add(int number1, int number2, int number3) {
return number1 + number2 + number3;
}
재정의는 참조된 클래스의 재정의 메서드를 상황에 맞게 사용하는 것입니다.
즉, 메소드의 이름은 같지만 상황에 따라 다른 역할을 수행합니다.
class Parent {
void display() { System.out.println("부모 클래스의 display() 메소드입니다."); }
}
class Child extends Parent {
// 오버라이딩된 display() 메소드
void display() { System.out.println("자식 클래스의 display() 메소드입니다."); }
void display(String str) { System.out.println(str); } // 오버로딩된 display() 메소드
}
이를 통해 한 유형이 상속 관계에서 다른 유형의 개체를 참조할 수 있습니다.
4. 상속
자바에서 상속이란? 기존 클래스를 재활용하여 새 클래스를 만드는 Java의 문법 요소오전.
상속이란 슈퍼클래스의 멤버(필드, 메서드, 내부 클래스)를 슈퍼클래스와 서브클래스로 나누어 서브클래스와 공유하는 것을 의미한다.
이것의 장점은 중복되는 코드가 줄어들고 서로 상속받은 클래스의 기능을 자유롭게 사용할 수 있다는 점입니다.
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 {
void coding() {
System.out.println("코딩하기");
}
}
그러나 상속을 사용하면 단점이 있습니다.
각 클래스가 촘촘하게 결합되어 결합도를 높이고, 상속을 사용하면 불필요한 속성과 기능도 상속받기 때문이다.
원천
* http://www.tcpschool.com/java/java_inheritance_overriding
코딩교육 TCP스쿨
4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바파이썬까지
tcpschool.com
