자바(java) 기반 객체 지향 프로그래밍(OOP) 용어 정리
기존 글인 자바(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
- 장점
- 다형적 매개변수
- 하나의 배열로 여러 종류 객체 다루기
댓글남기기