본문 바로가기

JAVA

Java - 자바 객체 지향의 원리와 이해(개념정리) - 1편

안녕하세요~ 개발을 잘하고싶은 개발자입니다.

여기에서는 책을 통해서 기본 개념을 정리해보는 시간을 가지도록 하겠습니다.

제가 읽을 책은 [스프링 입문을 위한 자바 객체 지향의 원리와 이해] - 김종민지음 입니다. 자바와 친해지기 위해 책을 읽고 관련 지식을 정리해놓고자 합니다. 

(JAVA 카테고리이기때문에, 스프링 관련 내용은 정리하지 않았습니다)

 

- 자바 프로그램의 개발과 구동

JVM : (Java Virtual Machine) 자바 가상 기계.

JRE : (Java Runtime Environment) 자바 실행 환경.

  => 윈도우, 리눅스, 애플 Mac OS등 각 플랫폼마다 JAVA에서 사용할 수 있도록 한다.

JDK : (Java Development Kit) 자바 개발 도구.

 

[현실 세계]

프로그램은 개발자가 개발 도구를 이용해 개발하고, 운영체제를 통해 물리적인 컴퓨터인 하드웨어 상에서 구동된다.

 

[가상 세계(자바 월드)]

JDK를 이용해 개발된 프로그램은, JRE에 의해 가상의 컴퓨터인 JVM에서 구동된다.

 

- 프로그램이 메모리를 사용하는 방식

하나의 프로그램이 실행될 때 프로그램이 메모리를 사용하는 방식 (기계어를 포함한 모든 프로그래밍 언어의 공통된 메모리 사용 방식)

코드 실행 영역 데이터 저장 영역

 

- 객체 지향 프로그램의 메모리 사용 방식

코드 실행 영역 스태틱(Static) 영역
(클래스의 놀이터)
스택(Stack) 영역
(메소드의 놀이터)
힙(Heap) 영역
(객체의 놀이터)

위의 메모리와 관련된 설명은 아래의 글을 참조하자.

 

자바 JVM(Java Virtual Machine)의 메모리 영역 - 간단 정리

= 힙 영역(Heap Memory) : JVM이 시작될 때 생성되어 애플리케이션이 동작하는 동안(=런타임) 동적으로 할당하여 사용되는 메모리 영역. - 힙 영역에 생성된 인스턴스와 배열은, 스택 영역의 변수나 다

xggames.tistory.com

- main() 메서드가 실행되기 전 JVM에서 수행하는 전처리 작업들

1] java.lang 패키지를 스태틱(Static) 영역에 배치

2] import된 패키지를 스태틱(Static) 영역에 배치

3] 프로그램 상의 모든 클래스를 스태틱(Static) 영역에 배치

 

- 객체 지향 프로그래밍 기본 지식

객체...

  - 세상에 존재하는 모든 것은 사물 즉 객체(object)이다.

  - 각각의 사물은 고유하다.

  - 사물은 속성을 갖는다.

  - 사물은 행위를 한다.

그리고 사물을 하나하나 이해하기보다는 사물을 분류(class)해서 이해하는 것이 인간의 인지법이다.

  - 직립보행을 하며 말을 하는 존재를 사람이라고 분류한다.

  - 짧은 다리, 날지 못하는 새를 펭귄이라고 분류한다.

  - 밤하늘에 반짝이는 사물들을 별이라고 분류한다.

 

- UML 표기법을 통하여 사람 클래스를 정의

Class명 사람 성춘향 이몽룡
속성들 나이
성별
몸무게
나이 : 16
성별 : 여자
몸무게 : 45
키 : 160
나이 : 18
성별 : 남자
몸무게 : 65
키 : 175
행위들 먹다
자다
걷다
싸다
먹다
자다
걷다
싸다
먹다
자다
걷다
싸다

사람 클래스에는 여러 객체(속성이 다른)가 존재할 수 있다. 이렇듯, 객체 지향이라는 것은 직관적이고 쉽다.

 

객체 지향의 4대 특성 (캡! 상추다)

1] 캡슐화(Encapsulation) : 정보 은닉

  - 객체 멤버의 접근 제어자

public 모두 접근 가능
protected 상속(이때는 다른 패키지에서도 접근이 가능하다는 뜻) / 같은 패키지 내의 클래스에서 접근 가능
default
(선언이 따로 안되어있는 경우, 기본)
같은 패키지 내의 클래스에서 접근 가능
private 클래스 내에서만 접근 가능

  - 참조 변수의 복사 (*중요)

public class Test {
    public static void main(String[] args) {
        // 기본 자료형 변수
        int age1 = 10;
        System.out.println(age1); // 10
        int age2 = 20;
        
        age1 = 20;

        System.out.println(age1); // 20
        System.out.println(age2); // 20

        // 참조 자료형 변수
        Person person_1 = new Person();
        Person person_2 = person_1;
        
        person_1.age = 10;
        person_2.age = 20;

        System.out.println(person_1.age); // 20
        System.out.println(person_2.age); // 20
    }
}

public class Person {
    public int age;
}

기본 자료형 변수에서는 스택영역(Stack memory)에서 각각 변수에 대하여 메모리가 할당되었고 (age1과 age2가 다름),

참조 자료형 변수에서는 힙영역(Heap memory)에서 하나의 객체에 대한 참조 변수가 메모리에 할당되어 있다. 즉, 하나의 참조 변수가 가진 주소값을 다르게 표기하는 것일 뿐이다. (person_1과 person_2는 같은 주소를 참조하고 있다)

 

기본 자료형 변수와 참조 자료형 변수는 똑같이 복사는되겠지만, 그 값을 값 자체로 해석하느냐 아니면 주소값으로 해석하느냐의 차이가 있다. 두가지 변수의 타입을 꼭 기억하도록 하자.

 

2] 상속(Inheritance) : 재사용

  - 상속? 상위 클래스의 특성을 하위 클래스에서 상속(특성 상속)하고, 필요한 특성을 추가, 즉 확장해서 사용할 수 있는 의미

  일반적으로 상속이라는 단어는 부모-자식관계를 지칭하나, 객체 지향에서의 상속이란 확장, 세분화, 슈퍼 클래스 - 서브 클래스의 개념이다.

 

public class Organism { // 생물 Class
    public void breath() {
        System.out.println("호흡하다");
    }
}

public class Person extends Organism { // 생물 Class를 상속
    public String name; // 이름
    public int age; // 나이
    public int height; // 키
    public int weight; // 몸무게
    
    public void eat() {
    	System.out.println("먹다");
    }
    
    public void sleep() {
    	System.out.println("자다");
    }
    
    public void walking() {
    	System.out.println("걷다");
    }
    
    public void pee() {
    	System.out.println("싸다");
    }
}

 

 

자바에서는 다중상속을 지원하지 않는다.

 

Java는 왜 클래스 간 다중 상속을 허용하지 않을까?- [Diamond Problem]

자바를 공부하다 보면 클래스 상속(extends)과 인터페이스 구현(implements)의 차이를 공부하면서 이런 차이점을 접하게 됩니다. 인터페이스는 다중 구현이 가능하지만, 클래스 상속은 단 하나의 클

readystory.tistory.com

 

3] 추상화(Abstraction) : 모델링

  - 추상? 여러 가지 사물이나 개념에서 공통되는 특성이나 속성 따위를 추출하여 파악하는 적용

  - 추상화? 구체적인 것을 분해해서 관심 영역에 대한 특성만을 가지고 재조합하는 것 (=모델링)

  추상화는 모델링이다.

  클래스 설계에서 추상화가 사용된다.

  클래스 설계를 위해서는 애플리케이션 경계를 정해야 한다. (어떤 애플리케이션을 만들 것인가??)

  객체 지향에서 추상화의 결과는 클래스이다.

 

// 사람 클래스를 코드로 표현
public class Person {
    public String name; // 이름
    public int age; // 나이
    public int height; // 키
    public int weight; // 몸무게
    
    public void eat() {
    	System.out.println("먹다");
    }
    
    public void sleep() {
    	System.out.println("자다");
    }
    
    public void walking() {
    	System.out.println("걷다");
    }
    
    public void pee() {
    	System.out.println("싸다");
    }
}

  - 추상화의 개념을 넓혔을 때 적용되는 내용

    -> 상속을 통한 추상화, 구체화

    -> 인터페이스를 통한 추상화

    -> 다형성을 통한 추상화

 

4] 다형성(Polymorphism) : 사용 편의성

  - 오버로딩(Overloading) : 같은 이름의 메서드 여러개를 가지면서 매개변수의 유형과 개수가 다르도록 하는 기술

      특징

        -> 메소드명은 동일하게 사용할 수 있다.

        -> 리턴타입은 같아도되고 달라도 됨 (상관없음)

        -> 파라미터 개수가 달라야 함. 개수가 동일한 경우에는, 타입이 달라야 함.

        (이 개념은, 반대로생각해보면 동일한 이름의 동일한 파라미터면.. 중복이니까 당연히 안되는데, 그 반대로는 가능하다고 생각하면 됨)

       ex)

        System.out.println(int x)

        System.out.println(double x)

        System.out.println(byte x)

        System.out.println(String x)

        System.out.println(Object x)

         ..

         ..

         ..

 

  - 오버라이딩(Overriding) : 상위 클래스가 가지고 있는 메서드를 하위 클래스가 재정의해서 사용

      특징

        -> 당연한 이야기이지만, 오버라이드 하고자 하는 메소드는 상위(슈퍼) 클래스에 존재해야함.

        -> 메소드 이름, 파라미터 개수, 파라미터의 자료형이 다 동일해야 한다.

        -> 메소드 리턴형 (오버로딩은 달라도 상관없다고 했다)이 같아야 함.

        -> 상위 메소드를 상속받아 그대로사용할 수 있고, 재정의하여 사용할 수도 있다. (단, 재정의한 경우에는, 부모클래스의 메소드는 실행되지 않는다.)

public Class Parent {
    public void happy() {
        System.out.println("나는 행복합니다.");
    }
}

public Class Child extends Parent {
    @Override
    public void happy() {
        System.out.println("아들도 행복합니다.");
    }
}

(메소드 오버라이딩)

 

 

출처 : 스프링 입문을 위한 자바 객체 지향의 원리와 이해 . 김종민 - 위키북스