블링블링 범블링

객체 지향 프로그래밍(Object-Oriented Programs) 본문

Technology/객체 지향 디자인 패턴

객체 지향 프로그래밍(Object-Oriented Programs)

뻠스키 2018. 4. 18. 10:24

객체지향프로그래밍(Object-Oriented Programs)


객체지향프로그래밍이란 실세계의 사물을 추상화(Abstraction), 캡슐화(Encapsulation)하고, 계층구조는 상속(Inheritance)시키며, 부모와 다른 자식의 특성, 행위는 다형성(Polymorphism)으로 구현된 것, 즉 객체의 구성으로 프로그램을 만들어 가는 것을 객체지향 프로그래밍이라고 한다. 이러한 캡슐화, 상속, 다형성을 이용해서 코드의 재사용성을 키우고, 프로그램의 유지보수의 비용을 감소시킬 수 있다는 장점이 있기 때문에 대부분의 프로그램은 객체지향 프로그래밍으로 구현한다.


먼저 객체지향의 구성요소와 특징에 대해서 알아보자.


[객체지향의 구성요소]


1. 객체(Object) 클래스의 인스턴스(실제로 메모리상에 할당된 것)이다. 객체는 자신 고유의 속성(attribute)을 가지며 클래스에서 정의한 행위(behavior)를 수행할 수 있다. 객체의 행위는 클래스에 정의된 행위에 대한 정의를 공유함으로써 메모리를 경제적으로 사용한다.


2. 클래스(Class) : 같은 종류(또는 문제 해결을 위한)의 집단에 속하는 속성(attribute)과 행위(behavior)를 정의한 것으로 객체지향 프로그램의 기본적인 사용자 정의 데이터형(user define data type)이라고 할 수 있다. 클래스는 프로그래머가 아니지만 해결해야 할 문제가 속하는 영역에 종사하는 사람이라면 사용할 수 있고, 다른 클래스 또는 외부 요소와 독립적으로 디자인하여야 한다.


3. 메서드(Method) : 메서드는 한 객체의 서브루틴(subroutine) 형태로 객체의 속성을 조작하는 데 사용된다. 또 객체 간의 통신은 메시지를 통해 이루어진다.


4. 메세지(Message) : 수신자(Receiver)와 송신자(Sender) 객체들 간의 상호작용의 수단으로 다른 객체에 특정 작업을 요청하는 신호를 말한다.


[객체지향의 특징]


1. 다형성(Polymorphism)

다형성이란 하나의 형태가 상황에 따라 여러가지 형태를 가질 수 있는 능력을 말한다. 객체지향이 주는 장점 중에 하나는 구현변경의 유연함이다. 객체지향 프로그래밍은 하나의 객체에서 다양한 타입을 변경해 사용할 수 있다. 즉, 하나의 변수명, 함수명이 상황에 따라서 다른 의미로 해석될 수 있는 것을 말한다. 오버로딩(Overloading)이나 오버라이딩(Overriding)이 있다.


[예제코드]

1)오버로딩(Overloading) : 하나의 클래스안에 있는 생성자, 메소드를 재정의하는 것을 말한다. 이름은 같지만, 매개변수의 자료형 또는 개수가 달라야한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class Student {
     
     
    int id;
    int age;
    String name;
     
    Student(int id,int age,String name){
        this.id =id;
        this.age =age;
        this.name =name;
    }
    public void Whoiam(String name) {
        System.out.println(name);
    }
    public void Whoiam(int age) {
        System.out.println(age);
    }
     
    public static void main(String[] args) {
         
        Student stu = new Student(0,12,"haha");
         
        System.out.println(stu.id +" " +stu.age +" "+ stu.name);
        stu.Whoiam(20);
        stu.Whoiam("what is your name?");
         
    }
}


2)오버라이딩(Overriding): 상속의 개념이다. 부모 클래스의 메소드를 하위 클래스에서 재정의하는 것을 의미한다. 상속관계에 있는 클래스 간의 같은 이름의 메소드를 정의하는 기술을 오버라이딩이라고 한다.


[클래스다이어그램]



[소스코드]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
public class Animal {
    Animal(){}
     
    public void bark() {
        System.out.println("동물은 어떻게 울까?");
    }
}
 
public class Cat extends Animal {
     
    Cat(){}
    @Override
    public void bark() {
        System.out.println("야옹야옹");
    }
}
 
public class Dog extends Animal{
 
    Dog(){}
    @Override
    public void bark() {
        System.out.println("멍멍");
    }
}
 
public class Tiger  extends Animals{
    Tiger(){
     
    }
    @Override
    public void bark() {
        System.out.println("어흥어흥");
    }
}
public class Main {
    public static void main(String[] args) {
         
        Animal animal = new Animal();
        Cat cat = new Cat();
        Dog dog = new Dog();
        Tiger tiger = new Tiger();
         
        animal.bark();
        cat.bark();
        dog.bark();
        tiger.bark();
         
    }
}


2. 상속성

상속은 'IS A'관계에 있다고 말할 수 있다. 부모 클래스가 사람이고, 자식 클래스가 학생, 선생님일 경우 "학생은 사람이다","선생님은 사람이다"라는 일반화가 성립되어야한다. 상속은 부모클래스를 상속받은 자식클래스는 부모클래스의 메소드를 사용하고 재정의가 가능하다.

상속에는 단일상속, 다중상속, 반복상속이 있다. 단일 상속은 부모와 자식 클래스간의 관계가 수퍼클래스와 서브 클래스로 유지되는 것을 말하며 다중상속은 하나의 클래스가 하나 이상의 클래스로부터 상속받은 것을 의미한다. 자바언어에서는 다중상속을 지원하지 않는다. 반복상속은 같은 조부모 클래스로부터 상속받은 두 부모 클래스로부터 상속받는 경우를 말한다.


3. 캡슐화

캡슐화란 데이터 구조와 데이터를 다루는 방법을 결합시켜 묶는 것을 말한다. 데이터를 은닉하고, 그 데이터를 접근하는 기능을 노출시키지 않는다는 의미로 사용할 때 캡슐화라는 용어를 사용한다. 즉, 데이터를 기능이라는 캡슐로 보호한다는 의미다. 

캡슐화의 장점으로는 정보은닉으로 내부자료의 일관성을 유지할 수 있고, 객체간의 인터페이스를 이용해 종속성을 최소화할 수 있다는 점이 있다.


[접근 제한자]

(1) pivate : 클래스 내부에서만 접근 가능

(2) public : 완전 공개

(3) (defalut) : 같은 패키지에 소속된 클래스에서는 접근 가능

(4) protected : 같은 패키지와 자식클래스에서 접근 가능


[예제코드]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class Student {
     
    int id;
    public int age;
    private String name;
    Student(){}
    Student(int id,int age,String name){
        this.id =id;
        this.age =age;
        this.name =name;
    }
    public String getName() {
        return this.name;
    }
}
public class Main {
    public static void main(String[] args) {
        Student stu = new Student(1,24,"mey");
         
        System.out.println(stu.name); //오류
        System.out.println(stu.getName()); 
 
    }
}


4. 추상화

추상화란 공통의 속성이나 기능을 묶어 이름을 붙이는 것을 말한다. 예를 들어 걷는다, 뛴다, 달린다, 날라간다라는 기능들을 "움직인다"라는 고통의 속성으로 묶어서 추상화할 수 있다. 객체중심의 안정된 모델을 구축하고, 현실세계를 자연스럽게 표현할 수 있다는 장점이 있다.


1)추상메서드 : 내용이 없는 메서드, 구현은 하지 않고 선언만한다. 메서드의 내용이 너무 일반적인 내용이라서 부모 클래스에서 구체화하여 정의할 필요가 없는 경우, 추상 메서드로 선언만하고 상속받은 자식 클래스에서 재정의하도록 할 때 사용한다.

2)추상클래스 : 한 개 이상의 추상 메서드를 포함하는 클래스를 말한다. 일반클래스는 세부적이고 구체적인 것에 반해서 추상클래스는 구체적이지 않고 추상적이다. 추상메서드는 선언만되고 구현이 되지 않는 불완전한 메서드이므로 객체로 생성되어서는 안된다. 따라서 이런 추상메서드를 포함한 클래스는 추상클래스로 선언해서 객체 생성을 금지한다. 그리고 추상메서드를 재정의하지 않을 경우에는 컴파일러는 에러를 발생시킨다. 그러므로 꼭 추상메서드는 재정의 되어야한다.

3)인터페이스 : 인터페이스는 추상클래스와 비슷한 기능을 하지만 극단적인 경우다. 추상메서드와 상수로만 이뤄져있다. 인터페이스는 다중 상속이 가능하다는 장점이 있다.

4) 추상클래스와 인터페이스 공통점과 차이점
자바언어의 기준에 의한 공통점과 차이점을 두고 있다.


[예제코드]

1)추상클래스와 인터페이스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
abstract public class Animal {
    int age;
     
    Animal(){
        this.age =10;
    }
    public int getAge() { //일반 메서드선언 가능
        return age;
    }
    abstract public void bark(); //추상메서드 선언만하고 구현은 안함
}
 
public interface food {
    public void eat(); //선언만한다.
}
 
 
public class Cat extends Animal implements food {
     
    Cat(){}
     
    @Override
    public void bark() {
        System.out.println("야옹야옹");
    }
     
    @Override
    public void eat() {
        System.out.println("생선좋아");
    }
}
 
 
public class Dog extends Animal implements food{
 
    Dog(){}
     
    @Override
    public void bark() {
        System.out.println("멍멍");
    }
     
    @Override
    public void eat() {
        System.out.println("사료주세요");
    }
}
 
 
public class Tiger extends Animal implements food  {
    Tiger(){
     
    }
    @Override
    public void bark() {
        System.out.println("어흥어흥");
    }
     
    @Override
    public void eat() {
        System.out.println("고기주세요");
    }
}
 
public class Main {
    public static void main(String[] args) {
         
    Animal animal = new Animal(); //추상클래스는 객체를 생성할 수 없다. 오류
        Cat cat = new Cat();
        Dog dog = new Dog();
        Tiger tiger = new Tiger();
         
//추상메소드 호출
 
        cat.bark();
        dog.bark();
        tiger.bark();
        //인터페이스 메소드호출
           cat.eat();
        dog.eat();
        tiger.eat();
 
         
    }
}




참고 위키백과

출처 : http://meylady.tistory.com/

Comments