본문 바로가기

Language/JAVA

[JAVA] 객체지향 개념

객체지향의 개요


객체지향 이론


객체지향 이론은 컴퓨터를 통하여 실세계와 같은 환경을 흉내내기 위해 발전한 이론이다. 실세계는 사물(객체)로 구성되어 있으며, 이러한 사물들의 상호작용에 의해 실세계는 작동한다.

실세계의 객체는 속성 + 기능 으로 구성되어 있다.

객체지향 이론은 실세계의 모든 사물들을 속성과 기능으로 정의하고, 사물들간의 상호작용을 정의해서 실제 세계를 흉내낸다는 이론이다.

객체지향 이론은 클래스, 상속, 캡슐화, 다형성의 개념을 중심으로 발전하였다.

 

객체지향 장점


✔ 문제를 쉽게 프로그램화 할 수 있다.

✔ 객체들의 독립성으로 데이터에 의존하지 않고 생산성을 향상시킬 수 있다.

✔ 객체라는 모듈을 부품처럼 재사용 할 수 있다.

 

 

클래스와 객체


객체지향 프로그램을 작성하다보면 같은 기능을 하는 객체를 여러개 생성해야 할때도 있다. 동일한 속성과 기능을 가진 객체를 생성하기 위해 클래스라는 템플릿을 사용한다.

즉 클래스는 여러개의 객체를 생성하기 위해 사용하는 형판, 틀이라고 생각하면 된다.

 

 

클래스와 객체의 구성


객체는 속성 + 기능으로 구성되며, 객체를 생성하는 클래스 역시 속성 + 기능으로 구성된다. 자바에서 객체를 생성하기 위해서는 반드시 클래스가 필요하다.

자바는 객체를 생성하기 위한 클래스를 작성하여, 그 클래스로부터 객체를 생성하고, 생성된 객체 사이의 관계를 정의하여 만들어진다고 볼 수 있다.

class Avg {
    String name;
    int avg;
    public String average(int kor, int eng)
    {
        avg = (kor+eng)/2;
        return name + avg;
    }
}

속성 - 이름, 평균 / 기능 - 평균구하기 

 

객체의 생성


클래스로부터 객체를 생성하는 과정을 실체화라고 하고, 객체는 인스턴스라고 부르기도 한다. 객체=인스턴스

하나의 클래스로부터 객체가 생성될 때 각 객체는 같은 속성과 기능을 가지지만, 속성에 데이터를 모두 다르게 넣을 수 있다.

public class AvgTest {
    public static void main(String[] args) {
        Avg student1 = new Avg();
        Avg student2 = new Avg();
        student1.name = "김철수";
        student2.name = "김영희";
        String st1_avg = student1.average(70, 80);
        String st2_avg = student2.average(80, 90);
        System.out.println(st1_avg);
        System.out.println(st2_avg);
    }
}

/*
실행결과
김철수75
김영희85
*/

평균을 구하는 클래스로부터 객체를 생성

 

 

상속 (Inheritance)


위의 student객체와 비슷하지만 속성과 메소드가 약간 다른 객체를 생성하려면 어떻게 해야할까?

당연히 새로운 클래스가 작성되어야 한다. 그러나 새로 작성되는 클래스는 기존에 만들어놓은 클래스를 이용해서 작성할 수 있다. 즉 기존 클래스로부터 모든 속성과 메소드를 상속받고, 더 필요한 속성과 메소드를 추가하여 새로운 클래스를 생성할 수 있다. 이러한 개념이 상속이다.

class Avg1 {
    String name;
    int avg;
    public String average(int kor, int eng){
        avg = (kor+eng)/2;
        return name + avg;
    }
}

class Avg1Total extends Avg1 {
    public int total(int kor, int eng) {
        int score = kor + eng;
        return score;
    }
}

public class AvgTest {
    public static void main(String[] args) {
        Avg1Total student1 = new Avg1Total();
        Avg1Total student2 = new Avg1Total();
        student1.name = "김철수";
        student2.name = "김영희";
        String st1_avg = student1.average(70, 80);
        String st2_avg = student2.average(80, 90);
        int st1_total = student1.total(70, 80);
        int st2_total = student2.total(80, 90)
        System.out.println(st1_avg + " 총점=" + st1_total);
        System.out.println(st2_avg + " 총점=" + st2_total);
    }
}

/*
실행결과
김철수75 총점=150
김영희85 총점=170
*/

Avg1Total 클래스는 Avg1클래스의 변수들과 함수를 사용할 수 있다.

클래스의 상속은 확장(extend)의 개념을 가진다. 즉 상위 클래스의 모든것을 상속받고 추가로 더 가지는 클래스를 구성하는 것이 상속이다.

 

 

캡슐화


프로그램 작성자는 숨겨야 하는 정보(private)와 공개해야 하는 정보(public)를 구분하여 기술할 수 있다. 객체를 사용하는 사람은 객체중에 공개하는 정보에만 접근할 수 있다. 캡슐화를 통해 객체의 사용자로부터 정보를 은폐할 수 있다.

캡슐화는 다음과 같은 장점을 제공한다.

✔ 객체에 포함된 정보의 손상과 오용을 막을 수 있다.

✔ 객체 내부의 조작 방법이 바뀌어도 사용방법은 바뀌지 않는다.

✔ 데이터가 바뀌어도 다른 객체에게 영향을 주지 않는다.

 

 

다형성 (Polymorphism)


다형성은 다양한 변신을 의미하는 그리스어에 기원을 두고 있다.

예를 들어 만원1장 = 천원10장 = 백원100개 는 모두 동일한 가치인 만원을 의미한다. 이렇게 만원을 다양한 형태로 나타낼 수 있는것이 다형성이다.

class Avg2 {
    String name;
    int avg;
    public String average(int kor, int eng){
        avg = (kor+eng)/2;
        return name + "두과목평균= " + avg;
    }
    public String average(int kor, int eng, int mat){
        avg = (kor+eng+mat)/3;
        return name + "세과목평균= " + avg;
    }
}

public class AvgTest {
    public static void main(String[] args) {
        Avg2 student1 = new Avg2();
        Avg2 student2 = new Avg2();
        student1.name = "김철수";
        student2.name = "김영희";
        String st1_avg = student1.average(70, 80);
        String st2_avg = student2.average(80, 90, 100);
        System.out.println(st1_avg);
        System.out.println(st2_avg);
    }
}

/*
실행결과
김철수두과목평균=75
김영희세과목평균=85
*/

두 student객체는 같은 함수를 호출하지만 매개변수 개수에 따라 다르게 응답한다.

 

 

 

'Language > JAVA' 카테고리의 다른 글

자바언어의 구조와 기본문법  (0) 2021.01.02
[JAVA] 상속  (0) 2020.06.20
[JAVA] 클래스의 기능  (0) 2020.06.15