
class Animal {
String name; //필드(속성)
int age; //필드(속성)
void eat() {...} //메소드
void speak() {...} //메소드
}class Human extends Animal {
String hobby;
String job;
void work() {...}
void cry() {...}
void laugh() {...}
}
// Human 클래스는 속성으로 name, age, hobby, job을, 메소드는 eat(),speak(),work(),cry(),laugh()[클래스접근권한] class 클래스명{
필드타입 필드명;
[메소드접근권한] 결과타입 메소드명() {
...
}
public static void main(String[] args) {
}
}
클래스명 클래스변수 = new 클래스명(); : 선언과 생성 동시에 (아래처럼 따로 가능)클래스명 클래스변수 ; : 클래스 객체의 레퍼런스 변수 선언클래스변수 = new 클래스명(); : 클래스 객체 생성 (new연산자 이용)클래스변수.멤버 : 객체 멤버 접근 (점(.)연산자 이용)클래스변수.필드명 = 값; : 필드에 값 대입클래스변수.메소드명(); : 메소드 실행//예시 : 원의 넓이 구하는 클래스
public class Circle {
int radius; // 멤버 필드(원의 반지름)
String name; // 멤버 필드(원의 이름)
public double getArea() { // 멤버 메소드 (원의 넓이 구하기)
return 3.14*radius*radius;
}
public static void main(String[] args) {
Circle pizza; //Circle객체 선언
pizza = new Circle(); //Circle객체 생성
// Circle pizza = new Circle(); (위의 두개 한번에 사용 가능)
pizza.radius = 10;
pizza.name = "자바피자";
double area = pizza.getArea();
System.out.println(pizza.name + "의 면적은 "+ area);
Circle donut = new Circle(); //Circle객체 선언과 생성
donut.radius = 2;
donut.name = "자바도넛";
area = donut.getArea();
System.out.println(donut.name + "의 면적은 "+ area);
}
}
: 매개변수 없고, 아무 작업 없이 단순 리턴하는 생성자
public class 클래스명 {
필드타입 필드명;
리턴타입 메소드명;
public 생성자명() { } //생성자명 = 클래스명
public static void main(String[] args) {
클래스명 변수명 = new 클래스명(); //이 때 컴파일러에 의해 위의 기본생성자 자동 삽입
...
}
}
: 객체 자신에 대한 레퍼런스
public class 클래스명 {
필드타입 필드명;
리턴타입 메소드명;
public 생성자명() { }
public 생성자명(필드타입 a){ // 보통 매개변수와 멤버필드명이 같을 때 사용
this.필드명 = a;
}
public static void main(String[] args) {
...
}
}
: 같은 클래스의 다른 생성자 호출
// 예시 : 제목과 작가 출력하는 클래스
public class Book {
String title; //멤버 필드(제목)
String author; //멤버 필드(작가)
void show() { System.out.println(title + " " + author); } //멤버 메서드(제목,작가 출력)
public Book() { //생성자1
this("",""); //생성자3호출, this() : 생성자 호출을 의미
System.out.println("생성자 호출됨");
} //기본생성자 (다른 생성자 생성 시, 기본생성자를 사용하려면 앞에 먼저 만들어줘야함)
public Book(String t) { // 생성자2
this(t, "작가미상"); //생성자3호출
}
public Book(String title, String author) { // 생성자3
this.title = title; //this : 객체를 의미
this.author = author;
}
public static void main(String [] args) {
Book javaBook = new Book("Java", "황기태"); // 생성자3 호출
javaBook.show();
Book bible = new Book("Bible"); // 생성자2 호출
bible.show();
Book emptyBook = new Book(); // 생성자1 호출
emptyBook.show();
}
}
접근지정자 [static] [final] 리턴타입 메소드명(인자들){
메소드 코드
}
: public, private, protected, default
| 접근 지정자 | 동일 클래스 | 동일 패키지 | 다른 패키지의 자식 클래스 | 다른 패키지 |
|---|---|---|---|---|
| public | o | o | o | o |
| protected | o | o | o | x |
| default | o | o | x | x |
| private | o | x | x | x |
접근 지정자 사용
- 클래스 : public, default
- 생성자, 멤버변수, 멤버메소드 : public, protected, private, default
- 지역변수 : 접근 지정자 사용 불가
| non-static 멤버 | static 멤버 |
|---|---|
| 객체마다 별도 존재 | 클래스당 하나 생성 (객체 내부가 아닌 별도의 공간에 생성) |
| 인스턴스 멤버 | 클래스 멤버 |
| 객체 생성 시 멤버 생성 | 클래스 로딩 시 멤버 생성 |
| 객체 생성 후 멤버 사용 가능 | 객체 생기기 전에도 사용 가능 |
| 객체 사라지면 멤버도 사라짐 | 프로그램이 종료될 때 사라짐 |
| 객체 내에 각각 공간 유지(공유x) | 동일한 클래스의 모든 객체들에 의해 공유 |
클래스명.static멤버 또는 객체명.static멤버
RAM공간에 대한 참고 자료
- 객체 생성 시 레퍼런스 변수는 Stack공간에 생성되고 Heap공간을 가리킴 (non-static멤버들은 객체 생성 시 변수가 가리키고 있는 Heap공간안에 생성)
- static멤버들은 Shared Data 공간에 생성
// 예시 : 인자 전달
public class 클래스명 {
static void increase(int m) {
m = m+1;
}
static void increase(Circle m) {
m.radius++;
}
public static void main(String args[]) {
int n = 10; //기본타입
increase(n); //n값이 매개변수에 복사되어 전달
System.out.println(n); //10 (실인자 값은 변경x)
Circle pizza = new Circle(10); //객체
increase(pizza); //객체 레퍼런스 전달
System.out.println(pizza.radius); //11
}
}: 한 클래스 내에서 둘 이상의 이름이 같은 메소드 작성
public class MethodSample {
public int getSum(int i, int j){ return i + j; }
public int getSum(int i, int j, int k) { return i + j + k; }
public double getSum(double i, double j) { return i + j; }
public double getSum(int i, int j) { return (double)(i + j); } //첫번째 메소드와 매개변수 개수와 타입이 같으므로 실패
}a = b; 로 b를 a에 치환하면, a와 b 레퍼런스는 b의 객체을 가리키게 되고, a의 객체는 가비지가 됨Person a, b;
a = new Person("이몽룡");
b = new Person("성춘향");
b = a; //객체 치환(b가 가리키던 객체는 가비지가 됨)