[32일] Java (19) - Class
package
패키지는 클래스가 저장된 위치이다. 패키지는 한 번만 선언을 해야 한다.
클래스를 사용하기 위해서는 클래스가 저장된 위치를 나타내는 패키지를 선언해야 한다.
이를 통해 다른 클래스를 import 하여 사용할 수도 있다.
import java.io.*;
import java.sql.*;
import java.util.Arrays; //해당 클래스를 직접 선언
import java.awt.*; //GUI 관련 클래스
import javax.swing.*; //GUI 관련 클래스
java. 뒤에 위치한 것이 패키지명이다. * 는 해당 패키지의 모든 클래스를 의미한다.
* 를 사용하여 모든 클래스를 가져올 수도 있고, * 대신 직접 클래스 명을 사용하여 해당 클래스만 가져올 수도 있다.
Access Modifier
접근 제어, 접근 제한, 접근 수정이라고 부른다.
접근의 허용 범위를 정한다.
package oop0908;
public class Test01_class {
public static void main(String[] args) {
// 클래스와 객체(Object)
}//main() end
}//class end
새로운 클래스를 생성하면 위와 같이 public이 붙는 것을 볼 수 있다. 이것이 접근 제어자이다.
종류
1. private
비공개한다는 의미로 클래스 내부에서만 접근이 가능하다. 따라서 은닉을 할 수 있다.
2. package(default)
위에서 언급한 package와는 다르다. package는 선언하지 않고 생략해야 하며 선언하면 오히려 에러가 난다.
현재 패키지 내에서만 접근을 할 수 있다는 의미이다.
3. protected
상속 관계에 있는 클래스가 다른 패키지에 있는 경우에만 접근이 가능하다.
4. public
공개한다는 의미로, 해당 java project 내에서 모두 접근이 가능하다.
Class
클래스를 만들 때에는 클래스 명의 첫 글자는 대문자로 해야 한다.
클래스는 멤버 변수(field)와 멤버 함수(method)로 구성되어 있다.
이미 멤버 변수와 멤버 함수를 사용해 본 적이 있다.
System.out.println(Math.PI); //멤버변수
System.out.println(Math.abs(-3)); //멤버함수
class Sungjuk { //package 생략되어 있음.
//package class Sungjuk
//클래스명의 첫 글자는 대문자로 한다
//멤버변수 field
public String name; //클래스 외부에서 접근 가능하다
int kor, eng, mat; //package 생략되어 있다
private int aver; //Sungjuk 클래스 내부에서만 접근 가능하다
//멤버함수 method
private void view() {}//view() end
void calc() { //package 생략되어 있음
//클래스 내부의 멤버들 간에는 Access Modifier와 상관없이 접근 가능하다
view();
aver=(kor+eng+mat)/3;
}//calc end
public void disp() {
System.out.println(name);
System.out.println(kor);
System.out.println(eng);
System.out.println(mat);
System.out.println(aver);
}//disp() end
}//class end
new 연산자
클래스를 사용하려면 메모리를 할당하여야 한다. 이때 new 연산자를 사용한다.
형식) new 클래스명()
이 new 연산자는 클래스로부터 객체를 생성시킨다.
우리는 그동안 기본 자료형을 사용해왔다.
//기본 자료형
int a = 3; //int는 메모리 4바이트 할당
new를 사용하여 참조 자료형이라는 것을 이용할 수 있다.
//참조 자료형(reference) -> 클래스
//RAM(Random Access Memory)의 heap 영역에 메모리가 할당되고 주소값이 발생된다
new Sungjuk(); //객체(Object)

new 연산자를 통해 만들어진 객체는 heap 영역에 저장된다.
//sj 참조변수(reference) : 메모리가 할당된 곳의 주소를 기억한다
Sungjuk sj = new Sungjuk(); //예)50번지
클래스를 변수에 담아 객체를 만드는데 이때 클래스를 담은 변수를 참조 변수라고 한다. 이 참조 변수에는 Sungjuk 클래스로부터 생성한 객체에 접근할 수 있는 주소 값이 저장된다.
참조 변수를 통해 클래스에 접근할 수 있도록 해주는 연산자가 있는데 . 이다.
//. 연산자
//-> 참조변수를 통해 객체에 접근하는 연산자
sj.name="";
sj.kor=100;
sj.eng=95;
sj.mat=90;

Sungjuk 클래스에는 aver라는 멤버 변수가 존재했다. 하지만 접근을 할 수 없는데 aver를 만들 때 private을 선언하였기 때문이다.
//. 연산자
//-> 참조변수를 통해 객체에 접근하는 연산자
sj.name="";
sj.kor=100;
sj.eng=95;
sj.mat=90;
//sj.aver 에러. private 속성은 클래스 외부에서 접근 불가능
sj.calc();
sj.disp();
//sj.view() : 에러. private 속성은 클래스 외부에서 접근 불가능
Sungjuk one = new Sungjuk();
one.name="박지성";
one.kor=20;
one.eng=30;
one.mat=35;
one.calc();
one.disp();
Sungjuk two = new Sungjuk();
two.name="김연아";
two.kor=100;
two.eng=95;
two.mat=90;
two.calc();
two.disp();
참조변수를 달리하여 여러 객체를 만들 수 있다.
참조변수가 가지고 있는 주소값을 확인할 수 있다.
//참조변수가 가지고 있는 객체의 주소값
System.out.println(one.hashCode());
System.out.println(two.hashCode());
System.out.println(sj.hashCode());

객체를 다시 다른 변수에 저장할 수 있다.
Sungjuk tmp = two;
System.out.println(tmp.hashCode());
tmp.disp();
