[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영역)에 데이터를 저장할 공간을 할당받고 그 공간의 참조값을 객체에게 반환해주고 이어서 생성자를 호출하게 됩니다.
- new 연산자가 oop객체에 저장될 메모리 공간을 할당
- 생성자가 oop객체를 초기화
- new연산자가 새로 생성된 객체의 주소 oop변수에 저장
- 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);
}
}
‘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();
}
}
동일한 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 해주어야 합니다.
공유하기
Twitter Google+ LinkedIn
댓글남기기