나의 IT일지
클래스 본문
자바의 타입에는 기본타입과 참조타입으로 구분이 된다. 기본타입은 변수에 객체 선언없이 사용할 수 있는 타입으로, 정수형(byte, int, long...), 실수형(float, double), 문자형(char), 논리형(boolean)이 기본타입에 해당한다.
반면, 참조타입은 변수에 객체 선언을 해야 사용할 수 있는 타입으로, 배열, 열거, 클래스등이 참조타입에 해당된다. 이때 객체 선언된 변수는 참조 변수라고하며, 힙 영역에 저장되어 있는 선언된 객체의 주소값을 저장한다.
클래스
현실에서 객체를 만들기 위해서 설계도가 필요하듯이, 자바에서도 객체를 만들기 위해서는 설계도가 필요하다. 자바에서 객체를 만들기 위한 설계도,틀을 클래스라고 하며, 클래스를 통해 만든 객체를 인스턴스라고 한다.
클래스는 해당 객체의 속성과 기능을 표현해야 한다. 그래서 클래스의 블록에서 속성은 변수(필드)로, 기능은 메서드로 선언한다.
class 클래스명{ 타입 변수 1 //속성 타입 메서드 1 //기능 타입 변수 2 //속성 } |
위의 구조는 클래스를 구현하는 구조로, 블록 안에 변수와 메서드를 선언해서 해당 클래스의 특성을 생성할 수 있다.
이외에도 클래스의 블록에는 기본타입인 필드 뿐만아니라 new연산자를 통해 객체를 생성할 수 있으며, 참조타입인 필드를 생성할 수 있다. 이렇게 클래스의 특성을 생성하는 것을 클래스 선언이라고 한다. 클래스 선언할 때, 다음과 같은 주의사항이 존재한다.
- 클래스명 선언할 때, 변수와의 구별을 위해서, 앞글자는 대문자를 사용해야 하며, "$","_"외의 특수문자와 숫자는 첫글자로 올 수 없다.
사용 가능 | 사용 불가 |
1. Car, Person, 2. $Car, Sport_Car |
1. 3Car, car 2. @Car, #Car |
- 클래스 선언할 때, 메서드의 블록 안에서 선언하면 해당 메서드를 호출할 때만 사용할 수 있는 로컬 형식이 된다.
사용 가능 | 사용 불가 |
public class Code2 {
Car mycar = new Car(); ... } } Class Car{ ... } |
public class Code2 {
Car mycar = new Car(); ... } } void meth(){ Class Car{ ... } } |
이렇게 클래스가 구현을 선언하면, 해당 클래스로 객체를 만들 수 있다.
new 클래스()
위의 구조는 클래스를 통해 객체를 생성하는 구조으로, new연산자를 통해 생성한다. new연산자는 클래스로부터 새로운 객체를 만드는 연산자로, 객체를 힙 영역에 생성하며, 객체의 주소를 출력하도록 되어 있다. 그래서 해당 객체의 주소를 저장하겠다고 선언한 뒤, 변수에 해당 주소를 저장함으로써, 참조변수를 통해 해당 객체에 접근할 수 있다.
클래스 참조변수 = new 클래스()
위의 구조는 객체를 생성한 뒤, 해당 객체의 주소를 참조변수에 저장하는 구조로, 해당 변수에 저장되는 값이 클래스를 통해 생성된 객체의 주소라는 것을 IDE에게 알려야 하기 때문에, 클래스를 타입으로해서 변수를 선언하는 것이다.
객체 생성의 예시를 들면, 배열(일반타입[ ]), 문자열(String), Scanner가 있다. 해당 기능들은 클래스를 통해 만들어지는 객체로, new연산자를 통해 생성하고, 해당 객체의 주소를 변수에 저장해서 사용한다.
클래스를 통해 객체를 생성했으면, 해당 객체의 기능을 사용하거나 속성에 값을 저장, 연산, 출력해야한다. 객체내에 구현되어 있는 필드나 메서드를 호출하기 위해서는 도트 연산자를 사용해서 아래와 같이 선언해야 한다.
참조변수.필드명 , 참조변수.메서드명(매개변수);
해당 구조는 객체내에 구현되어 있는 필드나 메서드를 호출, 사용하는 구조로, 참조변수에 저장되어있는 객체의 주소를 통해 객체에 접근한 뒤, 해당 필드, 메서드를 호출한다.
package pack0407;
public class Code2 {
public static void main(String[] args) {
Car mycar = new Car();
mycar.powerctl();
System.out.println("시동상황:"+mycar.power);
mycar.color = "black";
System.out.println("차량 색상:"+mycar.color);
}
}
class Car{
boolean power;
String color;
int wheel;
int speed;
boolean wiper;
void powerctl() {
power = !power;
System.out.println("현재 시동상황 :"+ power);
}
void speedup() {
speed++;
System.out.println("현재 속도상황 :"+ speed);
}
void speeddown() {
speed--;
System.out.println("현재 속도상황 :"+speed);
}
void wiperctl() {
wiper = !wiper;
System.out.println("현재 와이퍼 상황"+wiper);
}
}
"Car"클래스를 생성한 뒤, new연산자를 통해 객체를 생성 한 후, mycar라는 변수에 해당 객체의 주소를 저장한다. 그 후 "참조변수.필드명"를 통해 해당 객체의 필드에 접근하고 "참조변수.메서드명()"을 통해 해당 객체의 메서드롤 호출하는 것을 확인 할 수 있다.
클래스 내 필드 초기값
클래스 내의 필드는 초기값을 지정하지 않아도 초기값을 가지고 있는것을 확인할 수 있다.
분류 | 타입 | 초기값 | |
기본타입 | 정수형 | byte, short, int, long | 0 |
실수형 | float, double | 0.0 | |
논리형 | boolean | false | |
문자형 | char | " " | |
참조타입 | 배열, 클래스, String, 인터페이스 | null |
package pack0407;
public class Code1 {
public static void main(String[] args) {
Car mycar = new Car();
System.out.println("시동 처음 초기값:"+mycar.power);
System.out.println("색 처음 초기값:"+mycar.color);
System.out.println("속도 처음 초기값:"+mycar.speed);
System.out.println("바퀴 처음 초기값:"+mycar.wheel);
System.out.println("와이퍼 처음 초기값:"+mycar.wiper);
}
}
class Car{
boolean power;
String color;
int wheel;
int speed;
boolean wiper;
void powerctl() {
power = !power;
System.out.println("현재 시동상황 :"+ power);
}
void speedup() {
speed++;
System.out.println("현재 속도상황 :"+ speed);
}
void speeddown() {
speed--;
System.out.println("현재 속도상황 :"+speed);
}
void wiperctl() {
wiper = !wiper;
System.out.println("현재 와이퍼 상황"+wiper);
}
}
다수의 객체 생성
자바는 프로젝트 안에 패키지를 만들고, 패키지 안에 파일를 만들며, 파일에 클래스를 구연하고, 클래스의 블록에 메소드와 변수를 작성함으로써 프로그램을 생성한다. 그래서 같은 패키지에 있는 클래스는 같은 패키지에 다른 ".java"파일에서도 사용할 수 있다.
package pack0407;
public class Code3 {
public static void main(String[] args) {
Car mycar1 = new Car();
Car mycar2 = new Car();
mycar1.powerctl();
System.out.println("car1시동상황:"+mycar1.power);
System.out.println("car2시동상황:"+mycar2.power);
mycar1.color = "black";
System.out.println("car1차량 색상:"+mycar1.color);
mycar2.color = "red";
System.out.println("car2차량 색상:"+mycar2.color);
}
}
메모리 사용 영역
자바프로그램이 실행되면, JVM은 운영체제로부터 메모리를 할당 받는다. 이때, JVM은 할당 받은 메모리를 다음과 같이 분류해서 사용한다.
- Class영역 : 메소드영역이라고도 하며, 사용되는 코드에 대한 정보를 저장하고 영역으로, JVM이 시작할 때 생성되고 종료할 때 삭제된다. 해당 영역에 저장되는 데이터는 코드에서 작성된 클래스 정보, static 변수, 전역변수(클래스에서 선언되는 변수), 변수 정보(데이터타입, 접근제어자), 메소드 정보(메소드명, 리턴타입, 접근제어자)등이 있다.
- Stack영역 : 메서드를 실행할 때마다, 변수에 저장되어 있는 값을 사용하기 위해 임시로 사용하는 영역으로, 메서드가 시작할 때 생성되고 종료할 때 삭제된다. 해당 영역에는 지역변수, 매개변수등을 저장되며, 객체의 주소값을 가지고 있는 참조변수가 해당 영역에 저장되어 있다.
- Heap영역 : 클래스 영역에 있는 클래스로 생성된 객체가 저장되는 영역으로, 객체가 선언되고 해당 객체 주소의 참조변수가 생성될 때 생성되고, 참조하는 변수나 객체가 제거될 때, Garbage Collector를 통해 자동적으로 삭제된다. 해당 영역에는 배열, 클래스 같은 참조 타입의 객체를 저장되어 있다.