객체 지향 프로그래밍의 특징(java)
Java는 객체지향언어의 가장 대표적인 언어이다. 대표적 특징은 아래와 같다.
- 캡슐화
- 추상화
- 다형성
- 상속성
하나씩 살펴보자.
캡슐화
캡슐화란?
- 하나의 객체에 대해 그 객체가 특정한 목적을 위한 필요한 변수나 메소드를 하나로 묶는 것을 의미
- 클래스를 만들 때 만들어진 객체가 특정한 목적을 잘 수행할 수 있도록, 변수와 메서드를 관련성 있게 클래스에 구성해야 한다.
정보은닉
- 캡슐화를 하는 중요한 목적은 정보은닉
- 유저 정보를 가지고 있는 User 라는 객체가 public으로 선언되어 있다면 누구든 접근해서 유저 정보를 변경 가능하다. private 으로 해서 데이터를 보호, 접근 제한이 필요하다.
- private으로 보호된 변수는 getter나 setter 등의 메서드를 통해서만 간접적으로 접근이 가능하도록 하는것이 캡슐화의 중요한 목적이다.
- 즉, 사용자의 입장에서는 public 으로 정의된 속성만 알면 된다는 의미
추상화
세상에 모든 것을 다 클래스에 담고 객체를 만드는 것은 매우 비효율 적이다. 최소한 공통적인 요소나 필수적인 요소는 들어갔으면 하는 바램에서 만든 것이 추상 클래스이다.
예로, 벤츠, 아우디, 티코 등 우리가 생각하는 여러 종류의 자동차가 있다. 이것을 다 클래스화 하고 변수와 메서드를 개별적으로 만드는 것은 무모한 짓이다.
따라서 방금 나열한 자동차들의 공통요소나 특징을 추출하는 과정인 추상화를 거쳐 요소를 끄집어 내면 바퀴, 핸들, 차문, 유리창 등 필수적인 부품이 있다.
바퀴는 굴러가고, 핸들은 돌아가고, 차문은 열려야 한다는 공통적 행동들이 메서드가 된다.
이러한 과정이 추상화 하는 과정이다.
다시 정리하면 객체들은 실제 그 모습이지만, 클래스는 객체들이 어떤 특징들이 있어야 한다고 정의하는 추상화된 개념이다.
추상화 : 객체들의 공통된 특징을 파악해 정의해 놓은 설계 기법
다형성
형태가 같은데 다른 기능을 하는 것을 의미한다.(같은 동작 다른 결과물)
이를 통해 코드가의 재사용, 코드길이 감소가 되어 유지보수가 용이하도록 도와준다.
Overriding & Overloading
- Overriding
- 부모클래스의 메서드를 자식클래스에서 재정의해서 사용
- Overloading
- 같은 이름의 메서드를 다른용도로 사용할 수 있도록 구현
- 메서드끼리 이름은 같지만 매개변수의 갯수 혹은 데이터 타입이 달라야 한다.
// Overriding
public class Employee{
public String name;
public int age;
public void print(){
System.out.println("사원의 이름 = "+this.name+", 나이 = "+this.age);
}
}
//Emplyee 상속
public class Manager extends Employee{
String jobOfManage;
//overriding Employee의 pirnt() 메소드 오버라이딩
public void print(){
System.out.println("사원의 이름 = "+this.name+", 나이 = "+this.age);
System.out.println("관리자 "+this.name+"은 "+this.jobOfManage+" 담당입니다.");
}
}
//Overloading
public class OverloadingTest{
public void test(){
System.out.println("사용자 없음");
}
public void test(String name){
System.out.println("사용자 이름 = " +name);
}
public void test(String name, int money){
System.out.println("사용자 이름 = "+name+" , 사용료 = "+money);
}
}
상속성
객체지향의 꽃이다.
- 부모 클래스의 기능을 가져와 재사용할 수 있으면서도 동시에 새롭게 만든 클래스에 새로운 기능을 추가할 수 있게 만들어 준다.
상자 하나하나는 모두 객체이고, 자바 용어로는 Class이다.
하위 객체는 상위 객체의 특징을 물려받는다.
상속에 관련된 부분인 접근 제어자부터 집고 넘어가자.
접근제어자
public | protected | default | private |
---|---|---|---|
All | 상속 or 동일 패키지 | 상속 and 동일 패키지 | 클래스 내부 |
상속 받았다고 모든 경우에 다 사용할 수 있는 것은 아니다. 위와 같이 접근제어자에 따라 달라질 수 있다.
상속 받는 방법은 대표적으로 extends와 implements 두가지 방법이 있다.
extends
상속의 대표적인 형태이다.
부모의 메소드를 그대로 사용할 수 있으며, 오버라이딩 할 필요 없이 부모에 구현되어있는 것을 직접 사용 가능하다.
class Vehicle {
protected int speed = 3;
public int getSpeed(){
return speed;
}
public void setSpeed(int speed){
this.speed = speed;
}
}
class Car extends Vehicle{
public void printspd(){
System.out.println(speed);
}
}
public class ExtendsSample {
public static main (String[] args){
Car A = new Car();
System.out.println(A.getSpeed());
A.printspd();
}
}
implements
예부터 보자.
interface TestInterface{
public static int num = 8;
public void fun1();
public void fun2();
}
class InterfaceExam implements TestInterface{
@Override
public void fun1(){
System.out.println(num);
}
@Override
public void fun2() {
}
}
public class InterfaceSample{
public static void main(String args[]){
InterfaceExam exam = new InterfaceExam();
exam.fun1();
}
}
implements의 가장 큰 특징은 부모의 메소드를 반드시 Overriding(재정의) 해야한다.
부모 객체는 선언만 하며 내용은 자식에서 오버라이딩해서 사용해야 한다는 것이다.
위 코드를 보면 알수 있듯이, class가 interface를 사용할 때 implements를 써야 한다.
정리하자면 extends는 클래스를 확장하는 것이고, implements는 인터페이스를 구현하는 것이다.
인터페이스를 상속받는 클래스에서 인터페이스에 정의된 메소드를 구현하면 된다.
참조 사이트
- https://hashcode.co.kr/questions/471/implements%EC%99%80-extends%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90%EC%9D%B4-%EB%AD%90%EA%B3%A0-%EA%B0%81%EA%B0%81-%EC%96%B8%EC%A0%9C-%EC%93%B0%EB%8A%94%EA%B1%B4%EA%B0%80%EC%9A%94
- https://zbomoon.tistory.com/13
- https://seohc.tistory.com/121
- https://limkydev.tistory.com/30
- https://victorydntmd.tistory.com/117
- https://kim-hoya.tistory.com/37
- https://hyeonstorage.tistory.com/185
Leave a comment