3 분 소요

기존 글인 자바(java) 문법 정리로 기초를 정리하였으나, 시간이 지남에 따라 용어들이 헤매기 시작했습니다.
그래서 다시 한번 객체 지향 프로그래밍 (Object Oriented Programming) 위주로 정리해보았습니다.



Object-Oriented Programming 이란?

  • 정의 : 문제를 여러 개의 객체 단위로 나눠 작업하는 방식으로, 객체들이 서로 유기적으로 상호작용하는 프로그래밍 이론1
    • 클래스(class) : 객체를 정의하기 위한 청사진(또는 설계도)
    • 객체(object) : 하나의 역할을 수행하는 ‘메소드와 변수(데이터)’의 묶음 2
      • 클래스의 인스턴스화
  • 객체 지향 프로그래밍(OOP)는 크게 상속(inheritance), 다형성(polymorphism), 추상화(abstraction), 캡슐화(encapsulation) 개념들이 있다.



캡슐화(Encapsulation)

  • 정의 : 데이터/변수/메소드를 하나의 단위로 묶어 이것들을 다른 클래스로부터 숨기는 방법
    • 변수는 private로 선언 (데이터 보호 차원)
    • private로 정의된 변수는 getter, setter등의 메소드로만 접근 허용
    • DATA HIDING이 가장 큰 특징


  • 클래스 접근 제어자에서 public : 다른 패키지에서 인스턴스(객체)를 생성가능하다. 3
  • private : [메소드 접근 제어자] 동일한 클래스안에서만 접근 가능. this를 사용하는 변수들은 외부에서 접근 X, 상속 X
  • void : 리턴값이 없음을 의미
  • return : 리턴값이 있음을 의미 (이 때 리턴값의 데이터 타입 설정해야 함)
// Student.java 파일
public class Student {

    private int age; // 순서 : [접근 제어자] [리턴값의 데이터타입] [변수명]
    private String name;
    private String university;

    // 생성자(constructor) : 객체를 구축하고 초기화하는 역할
    public Student() {

    }

    public Student(int age, String name, String university) {
        this.age = age;
        this.name = name;
        this.university = university;
    }

    public int getAge() { return age; } // return : 반환

    public void setAge(int age) { this.age = age; } // Student 클래스 내에 있는 private int age에 저장되어 있는 값

    public String getName() { return name; }

    public void setName(String name) { this.name = name; }

    public String getUniversity() { return university; }

    public void setUniversity(String university) { this.university = university; }
}
// App.java 파일
public class App {

    public static void main(String[] args) {

        Student s = new Student();
        s.setAge(20);
        s.setName("poeun");
        s.setUniversity("LaLa Univ");

        System.out.println(s.getAge()); //20
        System.out.println(s.getName()); //poeun
        System.out.println(s.getUniversity()); //LaLa Univ

    }
}



상속(Inheritance)

  • 정의 : 특정 클래스가 다른 클래스의 속성(메서드와 변수들)을 얻는 경우를 말함
  • 상속하는 클래스 : 서브 클래스(subclass) / 파생 클래스(derived class)/ 자식 클래스(child class)
  • 특성들이 상속되는 클래스 : 슈퍼 클래스(superclass) / 부모 클래스(parent class)
  • super : 이 키워드를 사용하면 부모 클래스를 호출할 수 있다.
  • 상속은 Is-A 관계이다.
    • 아래 예시는 사람을 상속받은 학생 클래스를 실행하는 코드이다.
  • 특징
    • 프로그램 구조에 대한 이해도(Understandability) 향상
    • 재사용성(Reusability) 향상
    • 확장성(Extensibility) 향상
    • 유지보수성(Maintainability) 향상


  • protected : 자기 자신 클래스와 상속된 클래스에서 접근 가능 4
  • extends : 상속받을 때 사용
// Person.java 파일
public class Person {

    protected int age;
    protected String name;

    public Person() {

    }

    public Person(int age, String name) {
        this.age = age;
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    protected void showAge() {
        System.out.println("Age is "+ age);
    }
}
// Student.java 파일
public class Student extends Person { // Student는 Person을 상속받는다.

    private String nameOfUniversity;

    public Student(int age, String name, String nameOfUniversity) {
        super(age, name); // Person 클래스에 있는 age, name은 super를 써서 상속
        this.nameOfUniversity = nameOfUniversity;
    }

    public void showStudent () {
        System.out.println("Student name: " + name);
        System.out.println("Age: " + age);
        System.out.println("University: " + nameOfUniversity);
    }

    public void showAge() {
        super.showAge();
    }
}
// App.java 파일
public class App {
    public static void main(String[] args){

        Student s = new Student(20, "poeun", "LaLa univ");
        s.showStudent();
        /*
        Student name: poeun
        Age: 20
        University: LaLa univ
         */
        s.showAge(); //Age is 20
    }
}



추상화(Abstraction)

  • 추상화 클래스는 이를 확장하는 모든 클래스에 대해 공통 기능(functionality)을 보유한다.
  • 예를 들어 모든 동물들은 움직이고(move), 숨쉬고(breathe), 번식(reproduce)하기 때문에 동물 클래스(Animal Class)에 넣을 수 있다.
    • 즉, 공통 특성을 파악해 필요없는 특성을 제거하는 과정
  • 정의 : 객체들의 공통된 특징을 파악해 정의해 놓은 설계 기법 5
  • 특징
    • 추상 클래스(abstract class)에서 본체(body)가 없이 추상적인 메소드(abstract method)를 가질 수 있다.
    • abstract method가 하나 있으면, 클래스(class)도 추상(abstract)이어야 한다.
    • 추상 클래스는 인스턴스화할 수 없다. (new로 생성 불가능)
    • 클래스는 그것을 사용할 수 있도록 상속해야 한다.
  • 다음 예시는 모양을 본뜬 원과 사각형이다.


  • 오버라이딩(overriding) : 상속 관계에 있는 부모 클래스에서 이미 정의된 메소드를 자식 클래스에서 같은 시그니쳐를 갖는 메소드로 다시 정의하는 것6
// Shape.java 파일
public abstract class Shape { // abstract : we are not able to instantiate it

    public abstract void calculateArea(); // 그냥 추상적으로 남겨놓자!
}
// Circle.java 파일
public class Circle extends Shape{

    @Override
    public void calculateArea() {
        System.out.println("Calculating the area for circle...");
    }
}
// Rectangle.java 파일
public class Rectangle extends Shape{

    @Override
    public void calculateArea() {
        System.out.println("Calculate area for rectangle...");
    }
}

// App.java 파일
public class App {

    public static void main(String[] args) {

        Shape shape1 = new Circle();
        Shape shape2 = new Rectangle();
        shape1.calculateArea(); //Calculating the area for circle...
        shape2.calculateArea(); //Calculate area for rectangle...
    }
}



다형성(Polymorphism)

  • 정의 : 하나의 객체가 여러 가지 타입을 가질 수 있는 것을 의미7
    • 부모 클래스 타입의 참조 변수로 자식 클래스 타입의 인스턴스를 참조할 수 있도록 함


  • 아래 예시는 위의 상속 부분에서 Person과 Student를 이용하였다.
// App.java 파일
public class App {
    public static void main(String[] args){

        Student s = new Student(20, "poeun", "LaLa univ");
        Person s1 = new Student(21, "poeun1", "LaLa univ1");
        s.showStudent();
        s1.showStudent();
    }
}


  • 매개변수의 다형성 : 참조형 매개변수는 메소드 호출시, 자신과 같은 타입 또는 자손타입의 인스턴스를 넘겨줄 수 있다. 8
  • 장점
    1. 다형적 매개변수
    2. 하나의 배열로 여러 종류 객체 다루기





References

댓글남기기