[OOP] Class,Object, OOP의 특성

업데이트:

Class란?

Class는 Object(객체)의 템플릿입니다.
객체를 만들어 내기 위한 설계도 혹은 틀이라고도 합니다.
데이터 필드와 메서드 필드를 가지고 있습니다.

public class Study {
	
	private String subject; 
	private int price;	
    // --------------------------데이터 필드

	public String getSubject() {
		return subject;
	}
	public int getPrice() {
		return price;
	}
	public void setSubject(String subject) {
		this.subject = subject;
	}
    	public void setPrice(int price) {
		this.price = price;
	}
    // -----------------------------메서드 필드
}


Object(객체)란?

Class의 Instance입니다.
oop의 관점에서 클래스의 타입으로 선언되었을 때 ‘객체’라고 부릅니다.

Instance 설계도를 바탕으로 소프트웨어 세계에 구현된 구체적인 실체입니다.
oop의 관점에서 객체가 메모리에 할당되어 실제 사용될 때 ‘인스턴스’라고 부릅니다.
추상적인 개념(또는 명세)과 구체적인 객체 사이의 관계 에 초점을 맞출 경우에 사용합니다.
인스턴스라는 용어는 반드시 클래스와 객체 사이의 관계로 한정지어서 사용할 필요는 없습니다.
인스턴스는 어떤 원본(추상적인 개념)으로부터 ‘생성된 복제본’을 의미합니다.

public class Program {
	
	public static void main(String args[]) {
		
		Study oop = new Study();
		// new연산자를 통해서 Study 클래스를 통해서 oop라는 Object를 생성합니다.
		
		oop.setSubject("object");
		oop.setPrice(0);
		// Class에 있던 set 함수를 통해서 object에 값을 입력합니다.
	}
}

new 연산자 new는 클래스 타입의 Instance를 생성해주는 역할을 합니다.
new 연산자를 통해 메모리(Heap영역)에 데이터를 저장할 공간을 할당받고 그 공간의 참조값을 객체에게 반환해주고 이어서 생성자를 호출하게 됩니다.

  1. new 연산자가 oop객체에 저장될 메모리 공간을 할당
  2. 생성자가 oop객체를 초기화
  3. new연산자가 새로 생성된 객체의 주소 oop변수에 저장
  4. oop를 통해 Study에 접근 가능

즉, 프로그램에서 직접 돌아가는 것은 Object입니다. Class는 Object를 생성하기 위한 하나의 File같은 것입니다.


Encapsulation(추상화)란?

Class의 보안을 제공해주고, 다른 사용자가 Class안의 Member와 Function을 변경할 수 없도록 도와줍니다.

public class Program {
	
	public static void main(String args[]) {
		
		Study oop = new Study();
	
		oop.setSubject("object");
		oop.setPrice(0);
	}
}

EX) Program 클래스는 Study클래스에 접근 권한이 없을 때, Study의 Member와 setSubject(), setPrice() 함수를 변경할 수 있는 권한이 없습니다.


Inheritance(상속)이란?

코드의 재사용성을 위해서 존재하는 부모 자식간의 관계입니다.

public class Inflearn extends Study {
	// inflearn 클래스는 Study 클래스를 부모로 갖는다는 의미입니다.
}
public class Program {
	
	public static void main(String args[]) {
		Inflearn oop = new Inflearn(); // Inflearn 클래스를 통해서 oop Object를 생성함
		
		oop.setSubject("강의1");
		oop.setPrice(0);
	}
}

Inflearn Class엔 setSubject(), setPrice() 메서드가 없는데 에러가 발생하지 않습니다.
그 이유는 Inflearn Class는 Study Class를 부모로 가지고 있어 부모가 가지고 있는 함수와 멤버들을 자동으로 상속하기 때문입니다.


Polymorphism(다형성)이란?

동일한 조작 방법으로 메서드를 동작시키지만, 실제 동작은 다른 것을 의미합니다.
overloading, overriding이 그 예시입니다.

  • overloading

    • 생성자 오버로딩은 매개변수가 다른 생성자를 여러 개 만들어 내는 것으로 같은 클래스 내에서 이루어져야만 하고 선언된 매개변수 타입의 순서와 개수가 달라야합니다.
    • 메서드 오버로딩은 무조건 동일한 메서드의 이름을 가져야하며, 매개변수의 타입의 개수나 순서 둘 중 하나만 달라도 메서드 오버라이딩에 해당됩니다.
public class Inflearn extends Study {
		void printDescription() {
			System.out.println("It's a beginning level Class");
		}
		
		void printDescription(String subject, int price) {
			System.out.println("It's a beginning level Class. Subject : " + 
		                       subject + ", price : " + price + "." );
		}
}
public class Run {
// 실행을 위한 main 메서드		
	public static void main(String args[]) {
		Inflearn in = new Inflearn();
		in.printDescription();
		in.printDescription("인프런",5);
	}
}

image

‘printDescription’이라는 같은 이름의 메서드입니다.
한 개는 매개변수가 없고, 한 개는 매개변수를 가지고 있습니다.
같은 이름의 메서드이지만 서로 다르게 동작합니다.


  • overriding
    • 오버라이딩이란 상속 관계에 있는 부모 클래스에서 정의한 메서드를 자식 클래스에서 새롭게 정의하거나 확장하는 것을 말합니다.

부모 클래스

public class Study {
	
	private String subject;
	private int price;
	
	public Study() {}
	
	public String getSubject() {
		return subject;
	}
	public int getPrice() {
		return price;
	}
	
	public void setSubject(String subject) {
		this.subject = subject;
	}
	
	public void setPrice(int price) {
		this.price = price;
	}
	
	void printDescription() {
		System.out.println("It's a Class");
	}
}

자식 클래스

package doit.algorism.practice;

public class Inflearn extends Study {
	
		void printDescription() {
			System.out.println("It's a beginning level Class");
		}
}
public class Run {
	public static void main(String args[]) {
		
		Study st = new Study();
		st.printDescription();
		
		Inflearn in = new Inflearn();
		in.printDescription();
	}
}

image

동일한 printDescription 메서드를 가지고 있지만 다른 동작을 합니다.


Abstraction(추상화)이란?

추상화 클래스는 미완성 설계도라고 할 수 있습니다.
추상클래스는 미완성 클래스이기 때문에 인스턴스를 생성할 수 없습니다.
추상클래스에 선언된 메서드는 추상클래스에서 구현하지 않고, 추상클래스를 상속받은 자식 클래스에서 구현합니다.
그렇기 때문에 추상클래스는 반드시 상속관계를 통해서만 사용할 수 있습니다.

추상 Class

package doit.algorism.practice;

public abstract class Abstract_Study {
	public abstract void start();
	public abstract void finish();
}

자식 Class (1)

public class TodayStudy extends Abstract_Study {
	// Abstract_Study Class를 부모로 갖는다.
	
	@Override
	public void start() {
		 System.out.println("start at 21:00 AM");
	}

	@Override
	public void finish() {
		 System.out.println("finish at 24:00 AM");
	}
}

자식 Class (2)

public class StudyTime extends Abstract_Study {

	@Override
	public void start() {
		 System.out.println("start at 09:00 AM");
	}

	@Override
	public void finish() {
		 System.out.println("finish at 12:00 AM");
		
	}

}

상속을 받았기 때문에 무조건 메서드 Override 해주어야 합니다.


댓글남기기