객체란 ?
객체란 물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신의 속성을 가지고 있고 다른 것과 식별가능한 것을 말한다.
물리적으로 존재하는 자동차, 자전거, 학과, 강의, 주문 등이 모두 객체가 될 수 있다. 객체는 속성과 동작으로 구성되어 있다.
객체의 상호작용
객체들은 각각 독립적으로 존재하고, 다른 객체와 서로 상호작용 하면서 동작한다. 객체들 사이의 상호작용 수단은 메소드이다. 메소드는 기능이며 절차지향에서는 함수라 하며, 객체지향에서는 메소드라고 부른다.
메소드 호출
객체에 도트(.) 연산자를 붙이고 메소드 이름을 기술하면 된다. 도트 연산자는 객체의 필드와 메소드에 접근할 때 사용한다.
리턴값 = 전자계산기객체.메소드(매개값1, 매개값2);
클래스
클래스를 선언한 후 객체를 생성하는 방법은 new 연산자를 사용하는 것이다.
new 연산자로 생성된 객체는 메모리 힙(heap) 영역에 생성된다. 그리고 객체의 주소를 리턴하도록 되어있다.
이 주소를 참조 타입인 클래스 변수에 저장해 두면, 변수를 통해 객체를 사용할 수 있다.
클래스 변수;
변수 = new 클래스();
클래스 변수 = new 클래스();
이렇게 클래스 변수선언과 객체생성을 한개의 실행문으로 작성 할 수 있다.
힙(Heap)영역
힙 영역은 객체와 배열이 생성되는 영역이다. 힙영역에 생성된 객체와 배열은 JVM 스택영역의 변수나 다른 객체의 필드에서 참조된다. 참조하는 변수나 필드가 없다면 의미없는 객체가 되기 때문에 이것을 쓰레기로 취급하고, JVM은 쓰레기 수집기(Garbage Collector)를 실행시켜 쓰레기 객체를 힙영역에서 자동으로 제거한다.
JVM 스택(Stack) 영역
JVM 스택영역은 각 스레드마다 하나씩 존재하며 스레드가 시작 될 때 할당된다. 자바 프로그램에서 추가적으로 스레드를 생성하지 않았다면 main 스레드만 존재하므로 JVM 스택도 하나이다. JVM스택은 메소드를 호출할때마다 프레임을 추가하고 메서드는 종료되면 해당 프레임을 제거하는 동작을 수행한다.
자바에서는 아래의 절차에 따라 호출하게 된다.
1) 클래스 파일 찾기
2) JVM메모리에 로딩
3) 바이트코드 검증
4) 인터프리팅 ( 재해석 : 0 과 1로 변환)
5) Class Area ( method Area )에 기억시킴
6) static 변수 자동 초기화
7) main() 호출
클래스 선언
package oop;
public class Circle {
double radius;
double area;
// 면적을 계산하는 기능 기능 = method
void makeArea() {
area = Math.pow(radius, 2) * Math.PI; // 2제곱 * 원주율
}
}
double 데이터타입은 기본형 멤버변수이며 앞에 static이 붙어있지 않다.
기본형 멤버변수 static이 없는 것은 객체내에 만들어진 변수이며 인스턴스 변수라고 한다.
인스턴스변수는 힙 영역에 할당이 되면서 객체가 생성될 때 자동초기화 된다.
makeArea 메소드 내부에는 자바 라이브러리에서 지원하고 있는 Math.pow 와 Math.PI를 담고 있다.
위에서 보는 것과 같이 2제곱과 원주율의 곱을 나타내고 있다.
멤버변수와 메소드를 담고 있는 클래스 (클래스 선언)이다.
이와 달리 아래의 클래스에서는 static void main 으로 클래스로부터 객체를 생성한다.
package oop;
public class CircleTest {
public static void main(String[] args) {
Circle c;
c = new Circle();
c.radius = 3.0;
c.makeArea();
System.out.println("반지름이" + c.radius + "인원의 면적은 " + c.area + "입니다");
}
}
총 4개 클래스가 JVM에 올라간다. ( CircleTest , String, Circle , System.out.println )
main 메소드는 매개변수가 할당되는 메모리 공간은 stack 메모리 형태의 콜 스택영역으로 JVM 메모리 공간에 할당한다.
main 메소드에서 필요로 하는 args는 String 배열타입이고 실행을 하게 되면 Circle타입의 c라는 변수가 stack에 참조가 된다.
Circle c;
= 연산자를 수행하게 되면 c 에 참조하게 된다.
main메소드가 호출이 되면
c = new Circle();
new 키워드를 만나면 힙(heap)의 동적인 메모리 공간을 할당받는다.
할당받은 내용을 Circle(); 코드는 할당된 힙 메모리공간을 Circle 클래스의 내용으로 채운다.
클래스 내에 변수들은 할당되면서 자동 초기화된다.
메소드는 Circle클래스에 있는 메소드 선언부 makeArea()으로만 힙(heap)의 메모리 공간에 들어간다.
c.radius = 3.0;
c.radius 변수에 3.0을 대입한다.
객체에 도트(.) 연산자를 붙이고 메소드 이름을 기술하면 된다. 도트 연산자는 객체의 필드와 메소드에 접근할 때 사용한다.
도트(.) 연산자는 c가 참조하고 있는 메모리를 찾아간다. radius에 3.0을 넣는다.
c.makeArea 메서드를 호출
메소드의 선언부만 있기 때문에 실행하기 위해 void makeArea() 로 가서 호출하게 된다.
메소드 내부에 radius는 현재 사용중인 객체의 radius를 의미한다.
현재 사용중인 객체의 radius 는 3.0을 의미한다.
현재 사용중인 area에 계산된 값을 넣는다.
메소드가 끝나고 System.out.println 를 출력해준다.
결과값
반지름이3.0인원의 면적은 28.274333882308138입니다
실습을 통해 더 공부해보도록 하겠다.
'java' 카테고리의 다른 글
Selection Sort & Bubble Sort (0) | 2021.10.13 |
---|---|
java_4_객체와 클래스 (메모리영역) 실습 (0) | 2021.10.12 |
java_4_배열 (0) | 2021.10.12 |
java_ 3_ 반복문의 예외항목 (0) | 2021.10.09 |
java_ 3_반복문(do-while) (0) | 2021.10.08 |