Programming/Java

[ JAVA 수업 DAY 05 ] 클래스와 메소드

빠모스 2020. 5. 5. 00:58
반응형

(클래스와 메소드의 기본적인 내용은 생략하고, 수업시간 내가 잘 알아둬야 할 내용을 필기한 위주로 정리했다.)

 

클래스

- 모든 객체들의 생산처

- 클래스 = 객체를 생성하는 틀

- 프로그래밍이 쓰이는 목적을 생각하여 어떤 객체를 만들어야 하는지 결정한다.

- 각 객체들이 어떤 특징(속성과 동작)을 가지고 있을지 결정한다.

- 객체들 사이에서 메세지를 주고받도록 만들어준다.

 

메소드

  • 메소드 내에 return은 꼭 맨 마지막에만 들어오는 것은 아니다.
void aaa() {
	print(‘A’);
	print(‘B’);
	return;
	print(‘C’);
	print(‘D’);
}

=> 이럴 경우 C와 D는 출력하지 않고 호출자메소드로 돌아감. 

 

return 값은 대입 연산자를 통해서만 받아올 수 있다.

ex) int result = 객체.메소드();

 

  • 만약, 여러 개의 값을 리턴하고 싶다면? => 배열을 쓰거나 Collection 객체를 이용

ex) 

int[] aaa() {
	int a = 10;
	int b = 20;
	// return a, b; <= 불가능
	int[] arr = {a, b};
	return arr; // 가능
}

 

  • 만약, 리턴값의 유형이 double로 선언했다면, double이 받을 수 있는 값들은 모두 리턴이 가능합니다.

 

  • 리턴값을 무조건 사용해야 하는 것은 아닙니다.

 

메소드 선언 연습하기

class Singer { 
}

Singer[] getSingerList(String type){
	Singer[] list = new Singer[2];
	Singer[0] = new SInger();
	Singer[1] = new SInger();
	return list;
}

원래는 Method.java로 별개의 클래스를 만드는게 보편적이지만, 메인 클래스 위에 메소드 클래스를 정의해줘도 된다. 한 파일에서 두개의 클래스를 볼 수 있다. 원래는 따로 만들어주는게 더 좋은 코드다. 

 

생성자

뭔가를 생성하는 메소드의 일종이다. 

생성자는 유일하게 인스턴스 객체를 만들때 호출되는 메소드의 일종이다.

메소드는 아니고, 메소드의 일종이다.

야! heap 공간에 이만큼의 메모리를 할당해줘! 라는 명령이다.

일종의 행위이기때문에 메소드처럼 ()를 쳐주는데, 아무때나 호출하는게 아니라 인스턴스 객체를 생성할때만 호출되는 메소드기때문에 “생성자”라고 부른다. 

 

생성자의 특징

1. 클래스 명과 이름이 동일하다. (대문자로 시작)

2. 반환타입이 없다. void가 붙는게 아니라 아예 void나 int같은게 없다!!!

3. 디폴트 생성자

- 클래스 내에 생성자가 하나도 정의되어 있지 않을 경우 JVM이 자동으로 제공하는 생성자

- 형태 : 매개변수가 없는 형태, 클래스명() {}

 

근데 우리 구구단 등등 지금까지 했던거에서 생성자 하나도 안만들고 잘 했잖아?!

=> 클래스 내에 생성자가 없을경우 JVM이 자동으로 디폴트 생성자를 제공해왔기 때문.

형태 : 매개변수가 없는 형태, 클래스명() {}

 

4. 오버로딩을 지원한다.

ex)

class Dog {
	Dog() {}
	Dog(String s) {}
	Dog(int i) {}
	… // 이런식으로 같은 이름이지만 매개변수만 다르게 해서 가능
}

 

5. 인스턴스 변수(객체)를 생성할 때 속성의 초기화를 담당하게 한다. 

 

생성자에서 초기화하지 않는다면 기본값인 null과 0으로 초기화된다.

내가 만약 강아지 클래스의 이름과 나이를 처음부터 설정해주고싶다면,

class Dog {
	String name;
	int age;
	
    Dog(String n, int a) {
		name = n;
		age = a;
	}
}

Dog d = new Dog(“aaa”, 2); 
// 이렇게 객체 d를 생성하게 되고 이름은 aaa, 나이는 2로 초기화된다. 
// 한번에 내부적으로 움직이기 때문에 d.name, d.age를 안해줘도 바로 name과 age값이 설정되게 됨. 

 

=> 근데 그냥 .name, .age 쓰면 되지, 왜 굳이 생성자를 쓰나여?!

클래스의 기본적인 특징은 은닉성이다. 교수님은 교수자 클래스 출신, 우리는 학생 클래스 출신인데 우리가 교수님의 속성을 볼 필요가 있을까? .name, .age는 멤버변수들에 직접 접근하고 볼 수 있는 것이다. 그래서 클래스 생성시에는 멤버변수를 외부에서 접근하지 못하도록 private 변수로 세운다. 이럴 경우 d.name, d.age를 사용할 수 없고, 생성자만 가능하다. 

생성자를 활용해 초기화해주게되면 new Dog(“메리”, 4);를 외부에서 보면 Dog 클래스 안에 이름을 담당하는 멤버변수가 name인지, 나이를 담당하는 멤버변수가 age인지 모른다. 

 

=> 주의> 클래스 내에 생성자가 2개면 메인 클래스에도 해당 매개변수를 받는 생성자가 두개여야 한다. 매개변수를 받는 생성자가 있으면 JVM은 기본 디폴트 생성자를 만들지 않는다. 

 

 

6. this의 활용 : static 영역에서는 사용이 불가능하다.

 

d.name

d.age

처럼, name과 age가 class에 따라 설정된 데이터가 저장된 heap 영역의 주소값을 저장하는 객체 d에 .을 붙이고 저장된 공간에서의 name을 뜻한다.

 

this : 인스턴스객체 만든 아이의 주소값.

Dog(String n, int a) {
	name = n;
	age = a;
}

여기에서 객체가 늘어날때마다 각각 객체의 name과 age가 다르기 때문에, 지금 매개변수를 가지고 연결해주는 객체의 주소값이 필요하다. 그래서 this를 붙여준다.

Dog(String n, int a) {
	this.name = n;
	this.age = a;
}

 

우리가 했던

class Gugudan {
	void print() {
		this.print(2);
	}

	void print(int dan) {
	}
}

 

이것도, 두 개의 객체 gu, gu2가 있을 때,

gu에 해당하는 print() {}, print(int dan) {}이 있고,

gu2에 해당하는 print() {}, print(int dan) {}이 있다.

gu.print(); 로 호출하게 되면 gu의 주소값이 넘어가서 사실 void print()에서는 this가 생략된 것이다.

호출하는 객체의 주소값을 넘겨주기 때문에 This는 “자기참조객체”라고 하기도 한다.

 

Cf) 이클립스는 항상 맨 마지막에 실행됬던 메인메소드를 시행한다. 내가 지금 보고있는 메인메소드를 실행하려면 커서를 메인에 갖다놔야한다. 

 

 

실습 코드 및 과제

https://github.com/LeenaKim/Java_Lessons/tree/master/src/kr/ac/kopo/day05

 

LeenaKim/Java_Lessons

Source codes and notes from Java Lessons / 자바 수업시간 배운 내용과 과제 코드입니다. - LeenaKim/Java_Lessons

github.com

 

반응형