본문 바로가기
자바과정/Java

객체 지향 프로그래밍 4대 특징 (코드 실습)

by Parkej 2021. 9. 9.

 

OOP의 4대특징 코딩으로 감 익히기

 

상속(inheritance)

 

하위 or 자식에게 물려줄 슈퍼 or 부모 클래스를 생성해보자

public class Parents {
	String name = "Pezz";
}

- 간단히 변수를 선언하고 Pezz라는 문자열로 초기화를 진행했다. (선언과 동시에 생성)

- 여기에 접근 지정자 private를 하면 안된다.

 

 

상속받을 하위 or 자식 클래스를 생성하자

public class First extends Parents{
	
	public void info() {
		System.out.println("첫쨰 아버지 이름은 " + name + "이다.");
	}
}

 

public class Second extends Parents{
	
	public void info() {
		System.out.println("둘째 아버지 이름은 " + name + "이다.");
	}
}

 

- 하위 클래스 생성 후 extends 키워드를 통해 처음에 생성한 Parents 클래스를 상속받자

- 공평하게 첫째와 둘째를 구분했다.

* 뭔가 느껴지는게 있는가 ? 자식 클래스들 안에 name을 선언 및 생성한적이 없는데 name이라는 변수를 사용할 수 있게 된다. 이것이 상속의 힘이다.

 

 

해당 클래스들을 실행시켜줄 테스트 클래스를 생성해보자

public class Test {
	public static void main(String[] args) {
		First first = new First(); 
		Second second = new Second(); 
		
		first.info();
		second.info();
	}
}

- 동적 바인딩을 쓰려했지만 구조상 쓸곳이 없어서 쓰지 않았다.

- new 연산자를 통해 객체를 생성해주자. 그리고 각각의 함수를 호출한다.

 

Result

- 자 이런 결과가 나왔다. 이것이 바로 상속의 기본이다. 

 


추상화(abstraction)

- 추상화는 실제 세상을 객체화 하는것이 아니라 필요한 정보만을 간소화하는 것을 의미한다고 한다. 실제 지형도보다 지하철역간의 상대위치가 중요하게 정리된 지하철 노선도가 추상화의 대표적인 예이다.

- 프로그래밍 언어에서는 객체들의 공통적인 속성과 기능을 중심으로 추상화 한다. 

* 추상적 -> 구체화 ( 설계 ), 구별이 가능하게 해야함.

 


캡슐화(Encapsulation)

- 추상화를 통해 객체를 정의했다면 객체에 필요한 데이터나 기능(메소드)을 책임이 있는 객체에 그룹화 시켜주는 것을 캡슐화라고 한다.

- 사람을 캡슐화 해보자 아주 간단하게

 

public class Person {
	// 전역변수
	private String name;
	private int age;
	// 기본 생성자 default
	public Person() {
		
	}
	// 생성자
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
}

- 사실 맞는지 잘 모르겠다 내가 배운대로 해본건데 (기초가 중요해서 기초를 다시 배우는중)

- 자 이렇게 Person클래스는 사람에 관련된 정보기능만 모아둔 클래스라고 보면 된다. 

- 해당 클래스는 생성자를 통해 값을 넣어줄 수 있고 setter를 통해서도 넣어줄 수 있다. 

 


다형성(polymorphism)

- 이제 객체지향의 꽃 다형성에 대해 알아볼 것이다. 

- 객체지향은 객제간의 관계를 디자인하는 프로그래밍이라 한다. 그래서 다형성은 이 관계를 유연하게 해주는 특징이다.

 

- 사람은 음식을 먹는다 라는 명제에서 음식은 치킨이 될 수도 있고 라면이 될 수도 있다. 이 때 음식의 이런 특징을 다형성 이라고 한다. 

- 인터페이스가 이런 다형성을 구현하는 대표적인 개념이다. 

- 나는 Person 클래스를 수정해볼 것이다.  기존코드를 다시 쓰기 귀찮으니 위에서 보고오도록 하자 

 

전체 코드를 보기전에 수정한 Person 클래스 부분이다. 

- 조금 익숙하지 않을것이다 생성자에는 변수값만 넣는줄 알았는데 갑자기 클래스 객체가 온다고 ..? 하지만 이는 Spring에서 자주 쓰이는 그리고 아주 중요한 핵심 방법이니 감만 익혀두도록 하자

 

Behavior 클래스 

public class Behavior implements PersonInfo{

	@Override
	public String run() {
		return "뛰어";
	}

	@Override
	public String walk() {
		return "걸어";		
	}

}

 

- 너무 대충했다고 욕은 하지말도록 하자. 나도 배우는 입장이다보니까 어쩔 수가 없다. 그래서 모든 비판과 피드백을 허용한다.

- 지금 이 클래스는 인터페이스를 가져왔다 보통 이것을 오버라이딩이라고 한다. 

- 클래스가 아닌 인터페이스로 생성함으로써 실제 구현을 하위 객체로 넘기게 할 수 있다. 

오버라이딩(Overriding) - 부모클래스의 메소드와 같은 이름을 사용하며 매개변수도 같되 내부 소스를 재정의하는 것

 

PersonInfo 인터페이스를 가보자 

public interface PersonInfo {
	public String run();
	public String walk();
}

 

- 요렇게 기본적으로 공통화시킬 메소드를 타입과 이름을 함께 정의만 해준다음 쓰여질 클래스에 물려주는 것이다. 

- 그래서 Behavior 클래스는 PersonInfo안의 메소드만 오버라이딩하여 기능은 해당 클래스가 독립적으로 정의한 것이다. 

 

- 이렇게 정의해주는 Behavior 클래스를 Person 클래스에서 사용할 수 있도록 주입을 시켜주자.

 

 

Person 클래스

public class Person{
	// 전역변수
	private String name;
	private int age;
	
    // Behavior 클래스의 메소드 반환값을 담을 변수
	private String comment;
	private String comment2;
	
	// 생성자
	public Person(Behavior behavior) {
		comment = behavior.run(); // return 뛰어
		comment2 = behavior.walk(); // return 걸어
	}
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}

	public String getComment() {
		return comment; // 여기서 뛰어가 리턴됨
	}

	public String getComment2() {
		return comment2; // 여기서 걸어가 리턴됨 
	}
	
}

 

- Person 클래스의 의존관계이다. 

ㅋㅋ 봐달라

- Person 클래스는 PersonInfo를 의존하지만 이는 인터페이스이므로 메소드의 리턴타입이나 안의 로직들이 변경되더라도 Person 클래스의 코드는 건드릴 필요가 없다. 

 


 

좀 어렵게 느껴진다면 매우 쉽게 해보자

- 일반적인 오버라이딩의 기본 예제이다. 

 

오버라이딩(Overring)

// 부모 클래스
public class SuperRiding {
	void info() {
		System.out.println("부모라이딩");
	}
	
	void data(int a) {
		a += 1;
		System.out.println("SuperRiding : "+a);
	}
}


// 자식 클래스 
public class Riding extends SuperRiding{
	
	void info() {
		System.out.println("자식라이딩");
	}
	
	void data(int a) {
		a += 10;
		int b = 100;
		System.out.println("SuperRiding : "+a);
		System.out.println("Riding : "+(a+b));
	}
	
}


// 실행할 클래스
public class Runtest {
	public static void main(String[] args) {
		Riding over = new Riding();
		
		over.data(1);
	}

 

result

 

- 자 이렇게 부모클래스에서 정의한 메소드를 자식클래스가 부모를 상속받아 자식 클래스에서 재정의하여 사용하는 것이다. 

- 객체 생성을 하고 실행시키니 자식클래스의 void data 메소드가 실행된것을 확인할 수 있지 않는가 ?

- 자식 클래스에서 부모의 메소드를 수정해야 할 때 사용된다. 일반 클래스의 상속 관계에서는 많이 사용되지는 않고 추상 클래스나 인터페이스에서 필수적으로 사용되는 개념이다.
- 자식 클래스에서 부모 클래스의 메소드와 동일한 시그니쳐(메소드 이름, 리턴 타입, 매개변수의 개수/ 자료형/순서)를 적용하여야 한다.
- 오버라이딩 결과 부모 메소드는 은닉되고 자식 클래스에서 재정의된 메소드만 기본적으로 호출된다. 필요시 super. 으로 부모 메소드를 호출할 수 있다

 

 

 

오버로딩(Overloading)

- 자 오버로딩이란것도 있다 좀만 더 힘내보자 

- 오버로딩은 아주 간단하게 소개해주겠다. 

같은 이름을 갖고 있지만, 서로 다른 매개변수 형식을 가지고 있는 메서드를 여러 개 정의하는 것.

 

- 어떤가 한줄요약을 보니 이해가 바로 가지 않나?

 

요것도 조건이 들어있다 오버라이딩(Overring)과 비슷하다.

- 바로 리턴타입, 메소드 명은 같아야 하지만 매개변수의 차이로 오버로딩을 한다.

- 메서드 이름이 같아야한다.

- 메서드의 리턴타입이 다른 경우는 오버로딩이 성립되지 않는다.

- 매개변수의 개수 or 매개변수의 자료형이 달라야 한다. 

 

- 역시 글보단 눈으로 보는게 최고다 슥삭해보자.

 

	public int add(int a, int b) {
		return a+b;
	}
	
	public int add(int a, String b) {
		System.out.println(b);
		return a;
	}
	
	public int add(int a, int b, int c) {
		return a+b+c;
	}
	
	public int add(int a) {
		return a;
	}
	
	public void add() {
		System.out.println("Method : add()");
	}

 

- 오버로딩을 테스트하기위해 내가 직접 10시간(?)동안 고민하면서 만든 예제이다 대단하지 않은가 ? (ㅋㅋ)

 

	public static void main(String[] args) {
		
		loading lo = new loading();
		
		lo.add();
		System.out.println(lo.add(1));
		System.out.println(lo.add(1,2,3));
		System.out.println(lo.add(1,2));
		lo.add(1,"2");
		
	}

- 실행시켜봤다. 

 

result

만족스러운 결과가 나왔다. 

- 이렇게 하나의 메서드를 매개변수의 차이로 쓸 수가 있다 이것을 오버로딩이라고 한다

 

요약

 - 다양한 개성을 불어넣는것

 - 리턴타입이 뒤죽박죽이여도 되고 다양한 매개변수를 통해 개성을 준다. 

 - 같은 매개변수 숫자에 매개변수 이름이 다르다고 오버로딩이 되는게 아니다 주의하자 (매개변수 타입과 갯수이다.)

 

여기까지 ~

반응형

댓글