본문 바로가기
Sketch (Programming Language)/Java

Java의 정석 Chapter 6, 7. 객체지향 프로그래밍

by 생각하는 이상훈 2022. 5. 15.
728x90

객체지향 프로그래밍

객체지향언어는 기존의 프로그래밍 언어와 크게 다르지 않고 프로그램을 단순히 명령어로 보지 않고

여러 개의 독립된 "객체"들로 인식하려는 것이다.

 

특징

1. 코드의 재사용성이 높다.

2. 코드의 관리가 용이하다.

3. 신회성이 높은 프로그래밍을 가능하게 한다.


클래스와 객체

클래스란 객체를 만들기 위한 설계도이다. 즉, 해당 설계도를 통해 만들어진 것을 객체라고 부른다.

 

class Car {
	String color;		// 색상
	String gearType;	// 변속기 종류 - auto(자동), manual(수동)
	int door;			// 문의 개수

	Car() {}
	Car(String c, String g, int d) {
		color = c;
		gearType = g;
		door = d;
	}
}

class CarTest {
	public static void main(String[] args) {
		Car c1 = new Car();
		c1.color = "white";
		c1.gearType = "auto";
		c1.door = 4;

		Car c2 = new Car("white", "auto", 4);

		System.out.println("c1의 color=" + c1.color + ", gearType=" + c1.gearType+ ", door="+c1.door);
		System.out.println("c2의 color=" + c2.color + ", gearType=" + c2.gearType+ ", door="+c2.door);
	}
}

클래스의 선언은 이와 같은 방법으로 진행이 된다.

 


JVM 메모리 구조

 

JVM 메모리 구조는 위 runtime data area에서 메서드 영역, 힙, 호출 스택 영역으로 나뉜다.

 

메서드 영역 : 클래스의 클래스 파일(*.class)를 읽어 클래스 데이터를 저장

 

힙 : 프로그램 실행 중 생성되는 인스턴스가 저장되는 곳

 

호출 스택 : 메서드 작업에 필요한 메모리 공간을 제공

메서드가 호출되었을 때, 호출스택에 호출된 메서드를 위한 메모리가 할당되고 호출이 끝났을 때 자동으로 반환된다. 

 


 

초기화 블럭

 

클래스 초기화 블럭과 인스턴스 초기화 블럭은 다음과 같은 구문을 이용한다.

class BlockTest{
    static{
        System.out.println("클래스 초기화 블럭");
    }

    {
        System.out.println("인스턴스 초기화 블럭");
    }

}

인스턴스 초기화 블럭은 { }만을 이용하는 것을 볼 수 있고, 클래스 초기화 블럭은 static을 붙여서

메모리에 처음 로딩할 때만 수행함을 알 수 있다.

 


상속

 

부모 클래스(상위 클래스)와 자식 클래스(하위 클래스)가 있어서 자식 클래스는 부모 클래스를 선택해서,

그 부모의 멤버를 상속받아 사용한다.

상속을 통해서 이미 존재하는 클래스를 재사용해서 만들 수 있기 때문에 효율적이고, 개발 시간을 줄여주게 된다.

 


Object 클래스

클래스의 상속 계층도에서 최상위 클래스

 

class OBJ {
  // ...
}

오버라이딩

오버로딩과는 다른 개념으로 상속 관계에 있는 부모 클래스에서 정이된 메소드를 자식 클래스에서

같은 이름을 갖는 메소드로 다시 정의하는 것이다.

 

오버라이딩 조건

1. 메소드의 선언부는 기존 메소드와 완전히 같아야 한다.

2. 부모 클래스의 메소드보다 접근 제어자를 더 좁은 범위로 변경할 수 없다.

3. 부모 클래스의 메소드보다 더 큰 범위의 예외를 선언할 수 없다.

 


Super

부모 클래스로부터 상속받은 멤버를 자손 클래스에서 참조하는데 사용되는 참조 변수이다.

 

class SuperTest{
    public static void main(String args[]) {
        Child c = new Child();
        c.method();
    }
}

class Parent{
    int x = 10;
}

class Child extends Parent{
    void method(){
        System.out.println("x = " + x);
        System.out.println("this.x=" + this.x);
        System.out.println("super.x=" + super.x);
    }
}

위와 같이 this를 사용할 수도 있다. 하지만 super변수를 이용하므로써 클래스 계층 분리를 명확하게 한다.


다형성

다형성이란 하나의 객체가 여러 가지 타입을 가질 수 있다는 것이다.

자바에서는 부모 클래스의 타입의 참조변수로 자손 클래스의 인스턴스를 참조할 수 있다.

 

class Parent { ... }

class Child extends Parent { ... }

...

Parent pa = new Parent(); // 허용
Child ch = new Child();   // 허용
Parent pc = new Child();  // 허용
Child cp = new Parent();  // 오류 발생.

위와 같이 참조 변수의 다형성을 확인할 수 있다.


인터페이스

인터페이스란 추상클래스인데 일반적인 추상클래스와는 다르게 일반 메서드와 일반 멤버 변수를 구성원으로 갖는다.

 

인터페이스의 조건

1. 멤버변수는 public static final로 선언되어야한다.

2. 메서드는 public abstract 이다.

 

이때 abstract는 미완성의 의미를 갖어서 매서드 선언부만 작성하고 내용이 없는

추상 메서드를 선언할 때 이용하는 구문이다.

 

인터페이스를 통하여 개발을 편하게 하여 개발시간을 단축시키고, 표준화에 용이하고,

어떤 클래스에게도 관계성을 부여할 수 있고, 독립적인 프로그램을 가능하게 한다.


내부 클래스

내부 클래스란 클래스 내부에 선언되 또 다른 클래스로써 두 클래스의 관계가 끈끈할때 주로 이용한다.

class Outer {     // 외부 클래스
    ...
    class Inner { // 내부 클래스
        ...
    }
    ...
}

위와 같은 구문을 통해 내부 클래스를 생성할 수 있다.

 

내부 클래스의 용이성

1. 내부 클래스에서 외부 클래스의 멤버에 접근하기가 매우 쉽다.

2. 연관성이 있는 클래스간의 관계 형성으로 코드의 캡슐화 정도를 증가시킨다.

3. 외부에서는 내부 클래스에 접근할 수 없으므로, 코드를 간단하게 만든다.

728x90