[Java] 객체지향 프로그래밍 기초

박채은·2022년 11월 3일
0

Java

목록 보기
9/30
post-custom-banner

객체지향 프로그래밍

OOP: Object Oriented Programming
=> 객체를 만들고 객체들 간의 상호작용을 통해 특정 기능을 구성하는 프로그래밍 방법론

특징

1. 상속
부모가 자식에게 특징을 물려주듯이 상위 클래스의 특징을 하위 클래스에게 물려주는 것

2. 캡슐화
데이터와 코드의 형태를 외부에서 알 수 없게 하고, 데이터의 구조와 역할, 기능을 하나의 캡슐 형태로 만드는 것

3. 다형성
하나의 객체가 여러가지 형태를 가질 수 있는 성질

  • 상속
  • 오버로딩(Overloading)
  • 오버라이딩(Overriding)

4. 추상화
객체의 공통적인 속성과 기능을 추출하여 정의하는 것

  • 추상 클래스(abstract)
  • 인터페이스

장점

  1. 실세계를 반영하는 쉬운 모델링
  2. 보안성이 높다.
    • 캡슐화로 실제로 구현되는 부분을 외부에 드러나지 않아 정보를 은닉할 수 있다.
  3. 소프트웨어 생산성 향상
    • 코드를 재사용하기 쉽다.(객체, 캡슐화, 다형성, 상속)
  4. 유지보수가 쉽다.

이번 Section에서는 캡슐화, 다형성, 상속에 대해서는 다루지 않기 때문에 간단하게만 정리하고 넘어가겠다.

참고 - 객체지향 프로그래밍


클래스/객체

클래스: 객체를 정의한 설계도
객체(Object): 실재하는 어떤 대상
인스턴스(Instance): 클래스로 생성된 객체
인스턴스화(Instantiate): 클래스로부터 객체를 만드는 과정

클래스

1) 필드(변수): 클래스의 속성(변수)
2) 메서드: 클래스의 기능
3) 생성자: 클래스의 객체를 생성
4) 이너 클래스: 클래스 내부의 클래스

클래스 맴버 = 필드 + 메서드 + 이너 클래스

public class ExampleClass {
	int x = 10; // (1) 필드
	void printX() {...} // (2) 메서드
	ExampleClass() {...} // (3) 생성자
	class ExampleClass2 {...} // (4) 이너 클래스
} 

객체

1) new 생성자(): 인스턴스 생성, 주소값을 리턴

  • new: 힙 메모리에 공간을 할당받아 주소값을 반환한 후(객체 생성), 생성자를 실행시킨다.
  • 생성자(): 생성자를 호출하여 인스턴스 변수들을 초기화

2) 참조_변수 = new 생성자();: 주소값을 참조변수에 저장


1) Person 클래스는 클래스 영역에 저장된다.

2) 참조 변수 p는 스택 영역에 저장된다. 이때 p힙에 저장되어 있는 객체의 주소값을 갖는다.

힙 영역은 실제 객체의 값이 저장되는 공간, 스택 영역은 참조 변수가 저장되는 공간
= 스택에 있는 참조 변수로, 힙 영역에 존재하는 객체를 다룬다.

3) 클래스 내부의 메서드(클래스 메서드, 인스턴스 메서드 둘 다)는 클래스 영역에 저장된다.
같은 클래스로 만드는 모든 객체는 동일한 메서드를 공유하기 때문에 클래스 영역에 저장해두고, 필요한 경우에 참조해서 사용한다.

4) 클래스 내부의 변수는 종류에 따라 저장되는 위치가 다르다.

  • 클래스 변수(static 변수): 클래스 영역
  • 인스턴스 변수(non-static 변수): 힙 영역(객체 내부)

변수

public class Test{
    private int iv; // 인스턴스 변수.
    public static int cv; // 클래스 변수.
    
    public void print(){
    	int lv; // 지역 변수.
    }
 }
  • iv, cv는 클래스 내부에 선언되어 있으므로 멤버 변수

  • cv는 static으로 선언되었으니 클래스 변수이고, iv는 인스턴스 변수

  • lv는 메소드 내에 선언되었으므로 지역 변수

lv도 결국 Test 클래스 내부에 있으니까 멤버 변수 아닌가?
💁‍♀️ {} 로 둘러싸였으니 결국 지역 변수이다!

왜 지역변수는 직접 초기화를 해줘야 하는가?

💁‍♀️ 지역변수는 메서드 내에서만 사용되기 때문에 생명 주기가 짧다.
그러므로 매번 지역 변수를 0으로 자동 초기화하면 메모리 낭비가 심해진다.

멤버 변수는 왜 자동으로 초기화가 이뤄지나요?
💁‍♀️ 힙 메모리는 빈 공간이 저장될 수 없기 때문에


메모리 구조

Java의 메모리(Runtime Data Area)는 다음과 같이 구성된다.

클래스 영역(메소드 영역)

  • JVM은 클래스 파일(*.class)을 읽어들여, 클래스에 대한 정보를 메소드 영역에 저장한다.
  • 클래스의 필드, 메소드 등 클래스에 대한 정보들을 저장
  • 클래스 변수(static 변수), 클래스 메소드(static 메소드) 저장
  • 클래스 내부의 인스턴스 메소드도 클래스 영역에 저장됨
    • 인스턴스 변수는 Heap 영역에 저장됨
  • 런타임 시 생성된 모든 스레드가 공유하는 영역

스택 영역

  • 메서드 정보, 지역변수, 파라미터 값이 저장된다.

  • LIFO(Last In First Out) 구조

  • 메서드가 호출되면 Method Frame이 생성된다.
    Method Frame에는 해당 메서드의 매개변수, 지역변수, 리턴값 등의 정보들이 저장되어 있다.
    이는 스택 영역에 저장되었다가, 모든 동작이 완료되면 삭제된다.

힙 영역

  • new 연산자로 생성된 객체를 저장하는 영역 (인스턴스 변수)
  • 클래스(메소드) 영역에 로드된 클래스만 인스턴스화 가능
  • 객체 내부에는 필드(변수), 메서드, 이너 클래스가 있다.
  • 가비지 컬렉션이 수행되는 영역(자동으로 불필요한 메모리 공간이 정리된다.)

💡 참조
참조-1
참조-2
클래스 영역
스택/힙 영역
변수 적재 위치
참고-3
참고-4

post-custom-banner

0개의 댓글