[기술면접] 백엔드 기술 면접 질문 - OOP(객체지향프로그래밍)

송진영·2022년 4월 21일
0

기술면접

목록 보기
1/24
post-custom-banner

[OOP]

OOP란

OOP: Object Oriented Programming의 약자로, 객체지향 프로그래밍을 말한다.

의미

컴퓨터 프로그래밍 패러다임 중 하나로, 여러 개의 독립된 단위인 객체들간의 상호작용을 통해서 프로그램을 만드는 방식이다.

장점

  • 코드의 재사용에 용이하다.
  • 유지보수가 쉽다.

단점

  • 상대적으로 처리 속도가 느리다.
  • 설계 시 많은 시간과 노력이 필요하다.

OOP의 4가지 특징

1. 추상화

의미

추상화: 객체의 관련 속성만 표시하고, 불필요한 정보는 숨겨서 인터페이스와 구현을 분리하는 것이다.

예제

abstract class Animal{
	String name;
  int legs;
  String howling;
	public void setAnimal(String name, int legs, String howling) {
    	this.name = name;
      this.legs = legs;
      this.howling = howling;
      }
	public abstract void walk();
  public abstract void talk();
	public void run() {
		walk();
		talk();
	}
}
class Dog extends Animal {
	@Override
	public void walk() {
		System.out.println(this.name + "가 나타나 "+this.legs+"개의 다리로 걸어다닙니다.");
	}
    @Override
	public void talk() {
		System.out.println(this.name + "가 " + this.howling + " 소리 내며 울어댑니다.");
	}
}
class Cat extends Animal {
	@Override
	public void walk() {
		System.out.println(this.name + "가 나타나 "+this.legs+"개의 다리로 걸어다닙니다.");
	}
    @Override
	public void talk() {
		System.out.println(this.name + "가 " + this.howling + " 소리 내며 울어댑니다.");
	}
}
class Duck extends Animal {
	@Override
	public void walk() {
		System.out.println(this.name + "가 나타나 "+this.legs+"개의 다리로 걸어다닙니다.");
	}
    @Override
	public void talk() {
		System.out.println(this.name + "가 " + this.howling + " 소리 내며 울어댑니다.");
	}
}
public class Main {
    public static void main(String[] args) {
			Dog dog = new Dog();
			dog.setAnimal("개", 4, "멍멍");
			dog.run();
            //
			Cat cat = new Cat();
			cat.setAnimal("고양이", 4, "야옹");
			cat.run();
            //
			Duck duck = new Duck();
			duck.setAnimal("오리", 2, "꽥꽥");
      duck.run();
    }
}

이때 Dog, Cat, Duck 클래스에서 오버라이딩을 하지 않으면 부모 클래스와 비슷한 일을 함에도 계속 새로운 메소드를 만들어줘야 해서 비효율적이다.

2. 캡슐화

의미

캡슐화: 연관된 목적을 가지는 변수와 함수를 하나의 클래스로 묶어 외부에서 쉽게 접근하지 못하도록 은닉하는 것이다.

예제

public class Person{
    private String name;
    private int age;
    //
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}
public class Main {
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        Person person = new Person();
        person.setAge(17);
        person.setName("Tom");
        System.out.println(person.getAge());
        System.out.println(person.getName());                    
    }
}

3. 상속화

의미

상속화: 기존 클래스를 재사용하는 것으로 상위클래스를 하위클래스에서 물려받게 되면 상위클래스의 멤버변수나 메소드를 그대로 물려받아 사용할 수 있게 된다.

예제

1번 추상화 예제에서 Dog, Cat, Duck 클래스가 Animal abstract 클래스를 상속받아 해당 클래스의 멤버변수와 메소드를 사용하는 것을 볼 수 있다.
ex) walk, talk 메소드 & name, howling, legs 멤버변수

4. 다양화

의미

다향화: 부모-자식 상속 관계에 있는 클래스에서 상위 클래스가 동일한 메시지로 하위 클래스들을 서로 다르게 동작시키는 객체 지향 원리이다. 다양화를 활용하면 부모 클래스가 자식 클래스의 동작 방식을 알 수 없어도 오버라이딩을 통해서 자식 클래스를 접근할 수 있다.

예제

abstract class Animal {
    String name;
    int legs;
    String howling;
    Animal(String name, int legs, String howling) {
        this.name = name;
        this.legs = legs;
        this.howling = howling;
        }
    public abstract void walk();
    public abstract void talk();
}
public class Dog extends Animal{
    public Dog(String name, int legs, String howling) {
        super(name, legs, howling);
    }
    // 1. 오버라이딩
    @Override
	public void walk() {
		System.out.println(this.name + "가 나타나 "+this.legs+"개의 다리로 걸어다닙니다.");
	}
    @Override
	public void talk() {
		System.out.println(this.name + "가 " + this.howling + " 소리 내며 울어댑니다.");
	}
}
public class NewMain {
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // 2. 업캐스팅(자식 클래스 객체를 부모 클래스로 형변환)하여 객체 선언
        Animal a = new Dog("개", 4, "멍멍");
        // 3.부모 클래스 객체로 자식 메소드 호출
        a.walk();
    }
}

다양화의 예제로 1. 오버라이딩, 2 업캐스팅, 3 부모 클래스 객체로 자식 메소드 호출이 사용되었다.

profile
못하는 건 없다. 단지 그만큼 노력을 안 할 뿐이다.
post-custom-banner

0개의 댓글