클래스, 객체, 참조변수

박은빈·2022년 9월 27일
0

자바

목록 보기
3/25
post-custom-banner

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

자바는 객체 지향 프로그래밍 언어이다

객체를 간단히 얘기하면 세상에 존재하는 모든것이다.

또한 각각의 사물은 고유하고 속성을가진다

즉, 넒은 의미의 객체는 사람(유재석, 강호동…)도 객체라고 볼 수 있다

또 그안에서 나이, 몸무게와 같은 속성(property)와 자다, 울다, 먹다와같은 행위(method)를 가진다

원래 프로그래밍은 절차지향적인 프로그래밍이었다 절차지향은 프로그램 전체가 유기적으로 연결되있어서 프로그램의 실행속도가 빠르지만 유지보수가 어렵고 순서를 바꾸지 못하기때문에 비효율적이었다

하지만 객체지향이라는 개념이 등장하며 프로그램을 각가의 사물로 생각하여 하나로 이어진 것이 아닌 서로서로

상호작용이 가능하게 만든것이 바로 객체지향이다

그렇기때문에 객체지향은 유지보수가 뛰어나고 직관적이며 사람에게 친숙하다

클래스

자바에서 클래스는 객체를 정의하는 틀, 설계도이다

만약에 아이폰14라는 객체가 있다

이 아이폰14라는 객체는 스마트폰이라는 틀 안에 존재한다

즉 클래스 : 객체 == 스마트폰 : 아이폰14이 된다

이 스마트폰이라는 클래스 안에서 다른 객체인 갤럭시s20, 아이폰12 등등 수많은 객체를 만들 수 있다

클래스의 정의

	public class Circle {
접근지정자 클래스선언 클래스이름
	
	필드
	int radius;
	String color;

	메소드
	double calrArea() {
		return 3.14 * radius * radius;
	}
}

객체 생성

인스턴스

클래스로부터 객체를 선언하는 과정을 클래스의 인스턴스화 라고 한다

Circle cir = new Circle();
(클래스 자료형) {객체참조변수} = new연산자 [클래스()];

new연산자 : 자바는 객체를 생성할때 new연산자를 통해 Heap영역에 데이터를 저장할 공간을 할당받고 객체에게 반환하여준 다음 생성자” 클래스() ”를 호출하게된다

객체생성시 Heap구조

먼저 자바의 메모리 구조에 대해 간단하게 알아보면

자바는 Static, Stack, Heap으로 이루어져있다

  • Static

가장 바깥부분(필드)부분에 선언된 변수(전역변수)나 정정(static이 붙은) 변수, 클래스가 이 필드에 속한다

  • Stack

기본 자료형(int, double, boolean등)과 지역변수, 메서드 등이 이 필드에 속한다

  • Heap

간단하게 실제 메모리의 영역이다

객체타입의 데이터가 저장된다(String, Intege 등), 배열

실제 데이터를 가지고있는 Heap영역의 참조 값을 Stack영역이 가지고있다

이 참조값을 얻기위해 new연산자는 인스턴스를 생성해 Heap에 배치한 다음 참조값을 Stack에서 받아온다

위처럼 메모리의 구조가 있다

여기서 ‘스마트폰’이라는 클래스를 만들고 그 안에 ‘아이폰14’라는 객체를 만들어보자

이 아이폰14라는 객체를 만들기 위해 클래스에 기본적으로 프로퍼티와 메서드를 넣었다

class smartPhone {
	public String color;
	public int space;

	public void sound() {
		System.out.println("띵동");
	}
}

public class Phone {
	public static void main(String[] args){
		smartPhone iphone14 = new smartPhone();

		iphone14.color = "mid night";
		iphone14.space = 128;
	
		iphone14.sound();
	}
}

이렇게 코드를 작성하고실행을 해보자

main인 Phone클래스와 smamrtPhone클래스가 스태틱영역에 들어갔다

smartPhone iphone14 = new smartPhone();에서

smartPhone iphone14가 실행되어 smartPhone객체에 대하나 참조변수 iphone14를 만들었다

이제 new smartPhone()이 실행되어 인스턴스를 하나 만들어서 Heap에 배치한다

그 다음 객체 참조 변수 iphone14를 통해 작성한 값들을 대입한다

iphone14.color = “mid night”;

이렇게 객체 참조 변수 iphone14를 이용해 실제 Heap객체에 접근해 데이터를 할당하고있다

그렇게 데이터를 다 할당이 다 끝나면 마지막줄이 실행된다

iphone14.sound();

메서드가 실행되어 콜솔에 “띵동”이 출력되게 되고

참조가 끝난 Heap에 smartPhone객체는 갈비지컬렉터(GC)에 의해 사라지게 된다

참조 변수

자바는 크게 ‘기본 타입’과 ‘참조 타입’으로 분류됩니다

기본타입을 우리가 다 아는 자료형(int, boolean, double 등)이 있습니다

참조변수란

기본변수은 Stack에 실제 값을 저장하지만

참조변수는 Stack에 메모리의 주소값을 저장합니다

//기본변수
int num = 10;
String name = "유재석";

//참조변수
Integer num2 = new Integer(20);
String name2 = new String("강호동");

참조변수의 모습이 객체선언과 똑같이 생겼습니다

객체선언도 역시 참조변수를 이용해 객체를 생성하기 때문입니다

그림에서보면 num과 name은 Stack영역에 바로 데이터가 저장되지만

num2와 name2는 주소값이 저장되어 있습니다

이 num2와 name2를 객체 참조 변수라고 합니다

그리고 Heap에서 해당 주소를 찾아가 데이터를 넣습니다

또한 참조값을 넣거나 참조값을 확인할때도 Heap에서 꺼내와야하지 때문에

객체참조 변수와 객체참조 연산자( . )을 이용합니다

profile
안녕하세요
post-custom-banner

0개의 댓글