Java 객체지향 프로그래밍

Bennie97·2022년 2월 1일
0

객체지향 프로그래밍(Object Oriendted Programming)

객체란 무엇인가?

주체가 아닌것, 주체가 활용하는 것
우리 주변에 있는 모든 것으로 프로그래밍의 대상 : 사물, 개념, 논리..

객체지향 프로그래밍 장점

1. 코드의 재사용성이 높다.
새로운 객체를 생성할때마다 우리가 코딩한 클래스로부터 new를 통해 객체만 만들면된다.

3. 신뢰성이 높은 프로그래밍이 가능하다.
접근 제어자등을 통하여 멤버변수 등의 데이터 보호 가능하고
코드의 중복이 가능하다.

3. 추가/수정/삭제 등 코드 관리가 용이하다.
코드 간 관계를 통하여 손쉽게 코드 변경 가능하다.

흔히 객체지향 개념을 설명할때 붕어빵과 붕어빵 틀을 비유해서 설명한다.
붕어빵(객체)들이 붕어빵 틀에 의해서 생겨난다.

자바에서는 이 붕어빵 틀이 클래스라고 보면 되고
붕어빵이 객체라고 보면 된다.

즉 현실의 객체가 갖는 속성이나 특징 기능 같은것들이 추상화 되어서 그 클래스에 정의되고
우리는 그 클래스로부터 new 클래스이름(); 이런식으로 접근해서 객체를 만든다.

그럼 밑에서 예제를 살펴보자..

class Car {

    String color = "grey";
    int gear;
    boolean power;
    
    void poweron(){ 
    	power = true;
        gear = 1;
    }
    void poweroff(){ 
    	power = false;
        gear = 0;
    }
    void SpeedUp(){  
    	gear++;
    }
    void SpeedDown() { 
    	gear--;
    }
}

public class CarTest{
	public static void main(String args[]){
    	Car mycar = new Car();
        mycar.poweron();
        mycar.SpeedUp();
        mycar.SpeedUp();
        mycar.SpeedDown();
        
        System.out.println("현재 기어는 " + mycar.gear + "단입니다.");
	}  
}

위와 같은 예제에서
Car 이라는 클래스을 이용하여
mycar이라는 객체를 생성하여
클래스의 메서드를 사용하여 객체를 사용하였다.

위 코드중 객체 생성 부분인 Car mycar = new Car(); 을 실행하면 메모리의 힙(heap)영역에 객체가 생성되고
그 객체의 주소를 mycar 이 가리키는 식으로 이루어진다.

그럼 잠깐 JVM의 메모리 구조를 살펴보면서 어떻게 메모리에 객체가 생성되는지 알아보자.

JVM의 메모리 구조

출처 : https://www.geeksforgeeks.org/how-many-types-of-memory-areas-are-allocated-by-jvm/

Class Area에서는
클래스 원형이 로딩이된다.
Field 정보, method 정보, 타입 정보, 상수 풀등이 해당이 된다.

Method stack에서는
메서드 호출이 순서대로 쌓이는 구조로
로컬변수들도 쌓이는 구조이다.
쓰레드별로 별도로 관리한다.

Heap영역은
객체들이 생성되고 저장되는 장소이다.
위에서 Car mycar = new Car(); 이라는 문장이 실행될때
런타임에서 jvm이 빈 메모리 공간을 찾아서 객체가 생성된다. 그 생성되는
공간이 Heap영역이다.
사용되지 않는 객체는 Garbage Collector가 삭제한다.

위치에 따른 변수의 종류

1. 인스턴스 변수

선언위치 : 클래스 영역 { } 에 선언된다.

 public class Car{
 	static String fuel = "Gasoline";
    String color; // 인스턴스 변수
 }

변수의 생성 : 객체가 만들어질때 객체 별로 heap에 생성됨
변수의 초기화 : 타입별로 default 초기화
변수의 접근 : 객체 생성후 객체 이름으로 접근
객체를 만들 때마다 객체 별로 생성 -> 객체마다 고유한 상태(변수 값) 유지

 Car mycar1 = new Car();
 mycar1.color = "blue";
 
 Car mycar2 = new Car();
 mycar2.color = "red";

소멸 시점
Garbage Collector에 의해 객체가 없어질때 소멸된다.

2. 클래스 변수

선언위치 : 클래스 영역 { } 에 선언되며 static키워드가 붙음

 public class Car{
    static String fuel = "Gasoline"; // 클래스 변수
    String color; // 인스턴스 변수
 }

변수의 생성 : 클래스 영역에 클래스 로딩시 메모리 등록

  • 개별 객체의 생성과 무관함
  • 모든 객체가 공유한다,
    변수의 초기화 : 타입별로 default초기화
    변수의 접근 : 객체 생성과 무관하게 클래스 이름으로 접근(단 개별 객체이름으로도 접근 가능)
 	Car.fuel = "Disel";

소멸시점 : 프로그램 종료 시

3. 지역변수

선언 위치 : 클래스 영역 { } 이외의 모든 중괄호 안에 선언되는변수
메서드, 생성자, 초기화 블록 등
변수의 생성 : 선언된 라인이 실행될때 쓰레드별로 생성된 stack영역
변수의 초기화 : 사용하기 전에 반드시 명시적 초기화 필요
변수의 접근 : 외부에서는 접근이 불가능, 메서드 내부에서 이름에 바로 접근
소멸 시점 : { }을 벗어날때

profile
현명한개발자가되자

0개의 댓글