본문 바로가기

학위공부/독학사 요점정리

[독학사/컴공/객체지향프로그래밍]1.객체지향의 기본적 개념

반응형

1.객체지향의 개념 및 소개

1.1.객체지향의 기본적 개념

 

1.1.1.클래스

같은 종류(또는 문제 해결을 위한)의 집단에 속하는 속성(변수)과 행위(메소드)를 정의한 것으로 

객체지향 프로그램의 기본적인 사용자 정의 데이터형(user define data type)이라고 할 수 있다.

 

예:

클래스(Class)-LectureRoom

 

속성(attribute)

-id: String

-name: String

-capa: int

-intRunning: boolean

-floor: int

행위(behavior)

 

-setId(id: String)

-getId() : String

-setName(name: String)

-getName(): String

-setCapa(capa: int)

-getCapa(): int

-setInsRunning(insRunning: boolean)

-getInsRunning(): boolean

-setFloor(floor: int)

-getFloor(): int

 

1.1.2.객체

클래스의 인스턴스(실제로 메모리상에 할당된 것)이다. 즉 클래스라는 일종의 설계도를 기반으로

실제로 생성된 그 실체가 바로 객체이다. 객체는 자신의 고유한 속성(attribute)을 가지며

클래스에서 정의한 행위(behavior)를 수행할 수 있다.

 

1.1.3.메시지(Message)와 메서드(Method)

클래스로부터 생성된 객체를 사용하는 방법으로써, 객체에 명령을 내리는 행위라고 할 수 있다.

메서드는 한 객체의 서브루틴(subroutine)형태로 객체의 속성을 조작하는 데 사용된다.

메시지는 객체간의 통신이 이루어지는 방법이며 이 메시지를 통해 메소드가 호출되어 사용된다.

*메서드(Method) = 행위(behavior/operation) = 함수(function)

 

1.1.4.캡슐화(Encapsulation)

객체의 상세한 내용을 객체 외부에 철저히 숨기고 단순히 메시지만으로 객체와의 상호작용을

하게 하는 것. 정보 은닉(information)이라고도 하며 추상화랑 비슷한 표현이다.

예를 들면, 클래스를 선언하고 그 클래스를 구성하는 객체에 대하여 "public"또는 "private"등으로 정의해준다. "public"으로 정의된 함수는 외부에서 사용이 가능하지만 "private"로 선언된 함수는 외부에서 제어가 불가능하다.

 

1.1.5.상속(Inheritance)

상속은 클래스의 속성과 행위를 하위 클래스에 물려주거나, 상위 클래스에서 물려받는 것을 지칭한다.

-재사용으로 인한 코드가 줄어든다. 하위 클래스에서 속성이나 행위를 다시 정의하지 않고 상속 받아서 사용함으로써 코드가 줄어든다.

-좀 더 범용성 있게 사용할 수 있다. 예를 들어 Object타입의 매개변수에는 String타입이나 int타입의 객체가 쓰여도 문제되지 않는다.

왜냐햐면 String과 int타입 모두 Object타입의 객체를 상속받은 하위 클래스이기 때문이다.

 

ㄱ.직접-간접 상속

직접클래스: 파생 클래스 바로 위의 클래스

간접클래스: 직접 클래스 위의 클래스

 

ㄴ.다중상속

한 번에 둘 이상의 클래스를 파생받는 경우, 다시 말해 여러 부모를 둔 경우를 다중 상속(multiple inheritance)라고 한다. 매우 직관적이지만, '죽음의 다이아몬드'때문에 일반 클래스를 다중 상속하는건 극히 꺼려지며 인터페이스 용도의 클래스에서만 상속받는게 일반적이다.

 

ㄷ.죽음의다이아몬드(The Deadly Diamond of Death, DDD)

다중상속에서 상속받는 클래스에서 어느 부모의 메소드를 따라야 하는지가 명확하지 않아 문제가 생길 수 있음을 뜻하는 단어이다. 상속 관계가 마름모(다이아몬드)꼴으로 생겼다고 해서 붙여진 이름이다.

 

1.1.6.다형성(Polymorphism)

다양한 형태로 나타날 수 있는 능력을 뜻하며, 하나의 클래스 내부에 같은 이름의 행위를 여럿 정의하거나,

상위 클래스의 오퍼레이션을 하위 클래스에서 다시 정의하여 사용할 수 있다.

 

ㄱ.메소드 오버로딩

클래스 내부에 동일한 이름의 행위를 여럿 정의하는 것

-함수명은 같아야 한다.

-파라미터의 타입과 개수는 서로 달라야 한다.

-리턴타입은 관계없다.

-메소드의 이름 낭비를 방지하고, 같은 메소드에 여러 종류의 매개변수를 받을 수 있다.

 

예:

class student{

 

  void search(int number){

    system.out.println("번호:"+number);

  }

  void search(string name){

    system.out.println("이름:"+name);

  }

  void search(string name, int price){

    system.out.println("번호:"+number);

    system.out.println("이름:"+name);

  }

 

}

 

ㄴ.메소드 오버라이딩

상속으로 물려받은 자료나 메서드를 그대로 사용하지 않고 자신이 새로 만들어 사용하는 것

-함수명은 같아야 한다.

-파라미터의 타입과 개수는 동일해야 한다.

-리턴타입은 같아야한다.

 

예:

class Student{

 

  void show(){

    System.out.println("학생");

  }

}

 

class ScienceStudent extends student{

 

  void show(){

    System.out.println("과학동아리학생");

  }

}

 

 

ㄷ.OOP의 3요소

상속, 캡슐화, 다형성이 OOP의 3요소로 불린다.

 

1.1.7.객체지향과 절차지향의 비교

ㄱ.절차 지향 프로그래밍

알고리즘과 로직에 의거하여 단계대로 문제를 해결하도록 짜는 프로그래밍 언어. 대표적인 언어로 C와 Pascal이 있다.

 

ㄴ.객체 지향 프로그래밍

프로그래밍을 함에 있어서 데이터와 그 데이터를 처리할 메소드를 한데 묶어 객체를 만들고 객체를 조립하는 것을 목표로 한 언어.

객체 지향 언어의 특징은 추상화, 캡슐화, 상속성, 다형성이 있다. 

 

ㄷ.객체 지향 프로그래밍의 원칙

 객체지향 5원칙(SOLID), 객체지향에서 꼭 지켜야할 5개의 원칙을 말한다.

 

a.SRP(Single Responsibility Principle): 단일 책임 원칙

객체는 오직 하나의 책임을 가져야 한다. (객체는 오직 하나의 변경의 이유만을 가져야 한다.)

하나의 클래스가 두 가지 이상의 책임을 지니게 되면 클래스의 목적이 모호해지고 기능을 수정할 때 영향을 받는 범위도 커져서 유지보수가 힘들어지며, 결국 작성한 본인조차도 이해하기 힘든 코드가 될 수 있다.

 

b.OCP(Open Closed Principle): 개방-폐쇠 원칙

객체는 확장에 대해서는 개방적이고 수정에 대해서는 폐쇄적이어야 한다.

 

c.LSP(Liskov Substitution Principle): 리스코프 치환 원칙

자식 클래스는 언제나 자신의 부모 클래스를 대체할 수 있다. 즉 부모클래스가 들어갈 자리에 자식 클래스를 넣어도 계획대로 잘 작동해야 한다는 것. 상속의 본질인데, 이를 지키지 않으면 부모 클래스 본래의 의미가 변해서 is a 관계가 무너져 다형성이 없어지게 된다.

 

d.ISP(Interface Segregation Principle): 인터페이스 분리 원칙

클라이언트에서 사용하지 않는 메서드는 사용해서 안된다. 그러므로 인터페이스를 작게 나누어 만든다. 

 

e.DIP(Dependency Inversion Principle): 의존선 역전 원칙

추상성이 높고 안정적인 고수준의 클래스는 구체적이고 불안정한 저수준의 클래스에 의존해서는 안된다. 일반적으로 객체지향의 인터페이스를 통해서 이 원칙을 준수할 수 있게 된다.

 

반응형