본문 바로가기
Computer Science/Java

[Java] 객체지향프로그래밍(OOP, Object Oriented Programming)

by jeomn 2021. 12. 13.

1. 객체(Object)와 클래스(Class)

1
2
3
4
5
6
7
8
//코드 예시
//클래스 선언
class Animal{
    int idx;
    String name:
    int age;
    void eat();
    void move();
}
 

가. 객체

  우리 주위에 있는 모든 것 EX) 컴퓨터, 건물, 사람 등

객체들은 고유 특성과 행동을 가지고, 또 다른 객체들에게 행동을 요청하거나 정보를 주고받는 등의 상호작용이 일어남

프로그램에서의 객체:: 클래스가 데이터 타입으로 메모리에 생성된 것

> 클래스 모양 그대로 생성된 실체 > 클래스의 인스턴스

  나. 클래스

     객체의 캡슐 > 객체를 만들어내기 위한 설계도/틀

필드(field: 멤버 변수)와 메소드(method: 멤버 함수)로 구성됨

객체와 클래스의 관계 - 그 예시(학생)


2. 객체지향언어

  • 객체를 프로그램 내에 표현하기 위한 언어
  • 특징
    • 추상화(Abstraction)
    • 캡슐화(Encapsulation)
    • 정보은닉(Information Hiding)
    • 상속(Inheritance)
    • 다형성(Polymorphism)
  • 장점
    • 재사용성 高 > 생산성 향상
      • 상속, 캡슐화, 다형성으로 재사용성을 높임
    • 신뢰성 높은 프로그래밍
    • 보안 우수
    • 유지보수 우수
  • 단점
    • 절차지향에 비해 실행 속도 低
    • 설계에 많은 시간 소요

3. 추상화(Abstraction)

  객체의 공통적인 속성, 기능을 추출하여 정의/선언하는 것

실제의 객체들을 프로그램으로 정의하기 위해 공통적인 특성을 파악하여 정의하거나 제거하는 과정

> 클래스를 생성하는 것도 일종의 추상화

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//Cat 클래스
class Cat{
    String name;
    int age;
    int color;
    
    Cat(String name, int age, int color){
        this.name = name;
        this.age = age;
        this.color = color;
    }
    
    void sound(){
        System.out.println("야옹");
    }
    
    void walk(){
        System.out.println("냥냥 살금살금");
    }
}
cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//Dog 클래스
class Dog{
    String name;
    int age;
    int color;
    
    Dog(String name, int age, int color){
        this.name = name;
        this.age = age;
        this.color = color;
    }
    
    void sound(){
        System.out.println("멍멍");
    }
    
    void walk(){
        System.out.println("멍멍 성큼성큼");
    }
}
cs

  위의 Cat 클래스와 Dog 클래스는 공통되는 것들이 많음

> 공통되는 부분들을 class Animal을 정의하여 따로 관리할 수 있음

> 이 과정이 추상화

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//Animal 클래스
class Animal{
    String name;
    int age;
    int color;
    
    Animal(String name, int age, int color){
        this.name = name;
        this.age = age;
        this.color = color;
    }
    
    void sound(){
        System.out.println("동물이 운다");
    }
    
    void walk(){
        System.out.println("동물이 걷는다");
    }
}
cs

4. 캡슐화(Encapsulation)

  객체를 클래스로 설계해 내부를 보호하고 , 외부에서 내부를 볼 수 없게 하는 것

  정보 은닉(Information Hiding): 외부로부터 내부 클래스의 정보를 보호

캡슐을 생각 > 캡슐에 든 약은 어떤 색인지, 어떤 성분인지 외부에서는 알 수 없음

객체는 캡슐화가 원칙이지만, 외부와의 상호작용을 위해 몇 부분은 공개노출(예. TV 리모콘의 On/Off 버튼, 채널 버튼, 음량 버튼 등)

> 변수는 private 접근 설정, 공개 메서드를 통해 접근 통로 마련(setter/getter)

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
//Animal 클래스
class Animal{
    private String name;
    private int age;
    private int color;
    
    Animal(String name, int age, int color){
        this.name = name;
        this.age = age;
        this.color = color;
    }
    
    
    public void setName(String name){    
        this.name = name;
    }
    public String getName(){
        return this.name;
    }
    
 
    public void sound(){
        System.out.println("동물이 운다");
    }
    
    public void walk(){
        System.out.println("동물이 걷는다");
    }
}
cs

  위의 예시를 보면, Animal 클래스의 멤버 변수::name, age, color는 private으로 클래스 내부에서만 참조할 수 있게 설계됨

+ 외부에서도 동물의 이름(name)에 접근할 수 있도록, setName(String name), getName()함수를 선언함


5. 상속(Inheritance)

  부모(상위 개체)의 속성을 자식(하위 객체)가 물려받아 자식이 부모의 특성을 모두 가지고 있는 것

상위 개체 클래스는 부모(parent class) / 슈퍼(super class) 클래스

하위 개체 클래스는 자식(child class) / 서브(sub class) 클래스

extends 키워드 사용 (이름 extends 부모 클래스 이름)

 

위의 Animal 클래스를 상속받아 Dog 클래스 정의

1
2
3
4
5
6
7
8
9
10
11
12
13
class Dog extends Animal{
    private boolean alive;    //Dog만의 멤버 변수 추가
    
    Dog(String name, int age, int color, boolean alive){
        super(name, age, color);
        this.alive = alive;
    }
 
    public void jump(){        //Dog 만의 멤버 
        System.out.println("멍멍 점프!");
    }
}
 
cs

  코드에는 Animal 클래스의 필드/메소드가 없지만, Animal 클래스를 상속받았기 때문에 서브 클래스 Dog 객체는 슈퍼 클래스의 멤버와 서브 클래스의 멤버를 모두 가짐

Animal을 상속받아 생성한 Dog 객체

 

  • is a 관계
    • 자식 is a 부모 == 자식은 부모 타입
    • has a 관계
      • 일반적인 포함관계로, 상속 이외에 클래스를 재활용하는 방법
      • 2개 이상의 클래스에서 특성을 가져올 때 하나는 상속, 하나는 멤버변수로 처리
  • 단일 상속
    • 다중 상속: 여러 클래스의 기능을 물려받을 수 있지만 관계 매우 복잡
    • 자바는 단일 상속만 지원 > interface와 has a 관계로 단일 상속 단점 극복 가능
  • super 키워드
    • super로 조상 클래스 멤버 접근
    • super.walk()
    • super( ): 조상 클래스 생성자 호출, 클래스 생성자 첫 줄에서만 사용 가능, this()와 동시 사용은 불가

6. 다형성(Polymorphism)

  같은 이름의 메소드가 클래스/객체에 따라 다르게 동작되도록 구현하는 것(주로 상속에서 발생)

  • 오버라이딩(Overriding)
      • 슈퍼 클래스에서 구현된 메소드를 서브 클래스에서 동일한 이름으로 자신의 특징에 맞게 다시 구현
      • 아쉬운 기능에 +α를 하기 위해 사용
      • 조건:: 메서드 이름 일치, 매개변수 개수 일치, 매개변수 타입 일치 , 매개변수 순서 일치 , 리턴 타입 일치, 접근 제한자 >= 부모, 조상보다 큰 예외 불가
      • sound(), walk()함수 오버라이딩
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    class Dog extends Animal{
        private boolean alive;    //Dog만의 멤버 변수 추가
        
        Dog(String name, int age, int color, boolean alive){
            super(name, age, color);
            this.alive = alive;
        }
     
        @Override
        public void sound(){
            System.out.println("멍멍");
        }
       @Override
        public void walk(){
            System.out.println("멍멍 성큼성큼");
        }    
     
        public void jump(){        //Dog 만의 멤버 
            System.out.println("멍멍 점프!");
        }
    }
     
    cs

     

  • 오버로딩(Overloading)
    • 클래스 내에서 이름이 같지만 서로 다르게 동작하는 메소드를 여러개 구현
    • 조건:: 이름 일치, 매개변수 타입/개수 불일치 (리턴타입만 불일치인 경우는 오버로딩X)
    • walk()함수 오버로딩
    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
    class Dog extends Animal{
        private boolean alive;    //Dog만의 멤버 변수 추가
        
        Dog(String name, int age, int color, boolean alive){
            super(name, age, color);
            this.alive = alive;
        }
     
        @Override
        public void sound(){
            System.out.println("멍멍");
        }
        @Override
        public void walk(){
            System.out.println("멍멍 성큼성큼");
        }    
     
        public void jump(){        //Dog 만의 멤버 
            System.out.println("멍멍 점프!");
        }
        
        public void walk(String walkSound){    //walk 함수 오버로딩
            System.out.println(walkSound);
        }
    }
     
    cs

 

 

참고
황기대·김효수, 명품 Java Programing(개정 3판) ((주)생능출판사, 2017)

 

댓글