안드로이드 모의해킹/안드로이드 이론

객체지향 언어

seungwon9201 2024. 9. 4. 11:35

안드로이드는 객체지향 언어를 활용하는 환경에서 동작한다. 이번 글에서는 객체지향 프로그램의 특징에 대해서 정리해 볼 것이다. 

 

객체지향 프로그램

객체지향의 특징에 대해서 설명하기 전에 객체지향 프로그래밍이란 무엇일까?

객체지향 프로그래밍은 프로그램을 독립적인 객체(Object)라는 단위로 구성하고 이 각각의 객체들이 상태를 가지며 동작하는 것을 의미한다. 

 

첫 번째 특징

대표적인 객체지향 언어인 자바는 클래스와 객체를 사용해서 프로그램을 구성한다.

 

여기서 클래스란?

쉽게 말하자면 객체를 만들기 위한 설계도이다. 다시말해, 객체가 가져야 할 속성과 메서드를 정의하는 것이다.

 

만약 자동차라는 클래스를 정의한다면 이 클래스는 자동차의 특성(색, 모델)과 동작(주향, 정지)을 정의하는 것이다. 

public class Car {
    // 속성 (필드)
    String color;
    String model;
    int speed;

    // 메서드 (동작)
    void drive() {
        System.out.println("Driving...");
    }

    void stop() {
        System.out.println("Stopping...");
    }
}

즉, 클래스는 객체를 만들기 위한 설계도라고 할 수 있다.

 

그렇다면 객체는 뭘까?

객체 또한 쉽게 말하자면 설계도인 클래스를 바탕으로 만들어진 구체적인 실체를 의미한다. 

 

자동차 클래스에서 객체를 생성하면 이 각각의 객체는 실제로 존재하는 특정 자동차를 의미한다. 여기서는 두 가지 속성을 활용해서 객체 두 개를 생성했다.

public class Main {
    public static void main(String[] args) {
        // 객체 생성
        Car car1 = new Car();
        Car car2 = new Car();

        // car1 속성 설정
        car1.color = "Red";
        car1.model = "Sedan";
        car1.speed = 0;

        // car2 속성 설정
        car2.color = "Blue";
        car2.model = "SUV";
        car2.speed = 0;

        // car1 동작
        car1.drive();  // Output: Driving...

        // car2 동작
        car2.stop();   // Output: Stopping...
    }
}

위의 코드에서 보듯이 각각의 객체는 독립적인 특징이 있다.

즉, 객체란 실제 물체라고 생각하면 된다. 

 

두 번째 특징

객체지향 언어는 캡슐화가 가능하다.

 

캡슐화란 데이터를 외부로부터 보호하고, 데이터에 대한 접근을 제한하며, 객체의 내부 상태를 외부에서 직접 접근하지 못하게 하는 개념이다.

 

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
    private List<String> data; // 데이터를 private으로 보호

    public MyAdapter(List<String> data) {
        this.data = data;
    }

    // ViewHolder와 데이터를 연결하는 메서드
    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        String item = data.get(position);
        holder.textView.setText(item);
    }

    // Adapter의 나머지 메서드 구현...
}

위의 코드에서 RecyclerView.Adapter 클래스는 데이터를 표시하는 방법을 캡슐화한다. Adapter 클래스는 외부에서 데이터를 어떻게 표시하는지에 대한 구체적인 구현을 감추고, 오직 onBindViewHolder와 같은 메서드를 통해 데이터와 뷰를 연결한다.

 

 

이러한 특징 덕분에 클래스 내부의 세부적인 구현을 외부로부터 감줘서 외부에 정보가 노출되는 것을 막아 모듈성과 보안성을 높일 수 있다. 

 

세 번째 특징

상속이 가능하다.

 

상속을 통해 새롭게 정의되는 클래스를 자식 클래스라고 하고, 자식 클래스가 상속받는 기존의 클래스를 부모 클래스라고 한다. 자식 클래스는 부모 클래스의 모든 필드(속성)와 메서드(행동)를 물려받을 수 있으며, 필요에 따라 이러한 메서드를 재정의(오버라이딩)하거나 새로운 속성과 메서드를 추가할 수 있다.

 

  • 부모 클래스
public class Animal {
    // 필드
    protected String name;

    // 생성자
    public Animal(String name) {
        this.name = name;
    }

    // 메서드
    public void makeSound() {
        System.out.println("Some generic animal sound");
    }
}
  • 자식 클래스
public class Dog extends Animal {
    // 생성자
    public Dog(String name) {
        super(name); // 부모 클래스의 생성자 호출
    }

    // 메서드 재정의 (Overriding)
    @Override
    public void makeSound() {
        System.out.println("Bark");
    }
}

위의 예시에서 Animal 클래스는 부모 클래스이고, Dog 클래스는 자식 클래스이다. Dog 클래스는 Animal 클래스를 상속받아서 name 필드와 makeSound 메서드를 그대로 사용할 수 있게 된다. 또한, Dog 클래스는 makeSound 메서드를 재정의하여 고유의 동작(멍멍 소리)을 구현했다.

 

이러한 상속 덕분에 상위 클래스의 멤버를 하위 클래스가 자신이 멤버처럼 사용할 수 있게 되어서 코드의 재사용성을 높일 수 있다.

 

 

'안드로이드 모의해킹 > 안드로이드 이론' 카테고리의 다른 글

안드로이드 아키텍처  (1) 2024.09.05
DIVA앱 설치하기  (2) 2024.09.03