본문 바로가기
Java & Kotlin/Java

10. 클래스 (Class, 생성자)_1

by heekng 2021. 1. 19.
반응형
 

지금까지 배운 내용들은 모두 메인클래스 안에서 진행되었습니다. 이번엔 이 클래스가 무엇인지, 어떻게 이용하는지 알아보겠습니다.

자바는 객체지향언어로서 자바의 클래스란, 객체지향언어의 기본단위 == class == 클래스 입니다.

클래스를 붕어빵틀이라고 생각할 때 객체(인스턴스)를 붕어빵이라고 생각하고, 붕어빵틀을 이용해서 붕어빵을 만드는 행위를 인스턴스화(또는 객체화)라고 합니다.

클래스를 잘 정의하면 객체를 얼마든지 만들 수 있습니다.

객체지향언어에는 4가지 특징이 있습니다.

1. 추상화

추상화는 말 그대로 추상적인 틀을 잡는 것이며, 예를들어 자동차라는 객체가 있다면 엔진을 추상화하여 자동차를 만들기 이전에 미리 틀을 잡아두는 것과 같습니다.

2. 캡슐화

캡슐화는 곧 정보은닉과 같으며 쉽게 접근하지 못하여 정보를 쉽게 변경하지 못하게 하고, 코드의 재사용성이 증가하여 비용절감, 코드의 간결화, 오류의 파급효과가 줄어들게 됩니다.

3. 상속

상속이란 상위 클래스(부모클래스)의 모든 내용을 하위 클래스(자식클래스)에서 다시 작성할 필요 없이 이용하여 코드의 재사용성이 증가하게 하며, 부모클래스를 잘 정의해두면 코드 작성시간이 줄어들게 됩니다.

4. 다형성

다형성이란 같은 명령에 대하여 다른 내용이 나오게 하는 것입니다.


1. 생성자란?

클래스 내에는 생성자가 존재합니다.

1. 생성자는 함수와 비슷한 형태를 띄고 있습니다.

2. 생성자의 이름은 클래스의 이름과 동일합니다.

3. 클래스는 곧 객체이고 인스턴스화를 담당합니다.

4. 기본생성자(디폴트생성자)는 아무것도 존재하지 않는 생성자이며, 클래스가 만들어짐과 동시에 기본제공됩니다.

5. 기본생성자(디폴트생성자)는 생성자를 하나라도 정의하는 순간 기본제공되지 않는다.

6. 생성자를 정의하면 기본생성자를 오버로딩해야 한다.

7. this키워드를 이용해야 한다.


2. 생성자의 목적

1. 해당 클래스 필드를 메모리에 할당 한 후에 할당한 주소값을 리턴한다.

즉, 생성자를 이용해 new 클래스명();한 결과물은 해당 객체의 주소값을 나타내므로 객체를 만든다는것은 만든 객체의 주소값을 가지고 있다는 것을 뜻한다.

2. 초기화의 목적

생성자는 new하기 때문에 새롭게 초기화한다는 의미를 가지고있다.

 


 

3. 클래스 만들기

클래스를 만드는 기본적인 틀은 다음과 같습니다.

class ClassTest{ //새로 만든 클래스

}

public class Test{ //메인클래스

}

만약 ClassTest의 클래스의 객체가 이름과 나이를 가지고 있다면

class ClassTest{ //새로 만든 클래스

String name; //이름

int age; //나이

ClassTest() { // 기본생성자

}

ClassTest(String name, int age){ // 생성자 오버로딩

this.name = name; // 해당 객체의 이름을 외부에서 받아온 name으로

this.age = age; // 해당 객체의 나이를 외부에서 받아온 age로

}

}

public class Test{ //메인클래스

public static void main(String[] args) {

ClassTest test1 = new ClassTest("세걸음", 123);

//이름:세걸음 나이:123인 객체 생성

System.out.println(test1.name);

System.out.println(test1.age);

 

ClassTest test2 = new ClassTest(); //기본생성자로 만들어진 객체

test2.name = "홍길동";

test2.age = 456;

 

System.out.println(test2.name);

System.out.println(test2.age);

}

}

위와 같이 클래스 내에는 생성자가 존재하는데, 아무런 인자도 받아오지 못하는 생성자를 막아주기 위하여 기본생성자를 생성하고, 생성자 오버로딩하여 외부에서 이름과 나이를 받아오는 생성자를 만듭니다.

이름과 나이를 받아온 생성자는 내부에서 this.name과 같이 this.와 클래스 내부에서 만들어준 변수를 지정하여 "자기자신 객체(this)의 name은 (외부에서 받아온)name이다" 라고 내용을 넣어줍니다.

ClassTest 클래스는 이름과 나이를 인자로 받아옵니다. 때문에 main 안에서 ClassTest클래스의 객체를 만들 때

클래스명 객체명 = new 클래스명(생성자에서 지정한 인자 입력); 의 형태로 새로운 객체를 만들어줍니다.

이렇게 main안에서 test1 객체를 생성해주고, test1.name과 test2.age를 출력해주면 정상적으로 출력됨을 확인할 수 있습니다.

test1의 경우에는 클래스 내에서 만든 인자를 가진 상태로 객체를 만들었지만 test2는 인자를 아예 가지지 않은 상태로 생성되었습니다.(기본생성자)

이러한 경우에는 객체만을 만들어 두고 이후에 객체명.name, 객체명.age로 객체의 정보를 지정하여 수정할 수 있습니다.(정보변경도 동일하게 가능하다)


4. 클래스내의 함수(메서드)

클래스 내의 함수라고 이전에 배운 함수와 다른점은 없습니다.

main의 함수는 main클래스 안에서 선언하였기 때문에 메인안에서 함수명만으로도 이용 가능했지만, 메인 외부 클래스에서 선언한 함수는 이용할 때 클래스를 지정해주어야 한다는 차이점만 존재합니다.

위에서 이용한 예시를 수정하여 다시 예를 들어보겠습니다.

class ClassTest{ //새로 만든 클래스

String name; //이름

int age; //나이

ClassTest() { // 기본생성자

}

ClassTest(String name, int age){ // 생성자 오버로딩

this.name = name; // 해당 객체의 이름을 외부에서 받아온 name으로

this.age = age; // 해당 객체의 나이를 외부에서 받아온 age로

}

 

void show() { // 이름과 나이를 보기좋게 보여주는 함수

System.out.println("이름: "+this.name+" 나이: "+this.age);

}

}

public class Test{ //메인클래스

public static void main(String[] args) {

ClassTest test1 = new ClassTest("세걸음", 123);

//이름:세걸음 나이:123인 객체 생성

System.out.println(test1.name);

System.out.println(test1.age);

 

ClassTest test2 = new ClassTest(); //기본생성자로 만들어진 객체

test2.name = "홍길동";

test2.age = 456;

 

System.out.println(test2.name);

System.out.println(test2.age);

System.out.println(); //한줄넘기기

test1.show();

test2.show();

}

}

ClassTest클래스 내부에 void show()로 이름과 나이를 보기좋게 보여주는 함수를 선언해주었습니다.

클래스함수 내에서는 this를 이용하여 해당객체의 정보를 가져올 수 있습니다.

이후에 객체를 생성해주고 객체명.(해당클래스의)함수명 으로 함수를 이용하였고 그 결과 콘솔에서 정상적으로 출력됨을 확인할 수 있습니다.

반응형

'Java & Kotlin > Java' 카테고리의 다른 글

13. final  (0) 2021.01.19
12. Static  (0) 2021.01.19
11. 열거형 (Enum)  (0) 2021.01.19
9. 메서드, 함수 (Function, 오버로딩)  (0) 2021.01.19
8. 배열 (Array)  (0) 2021.01.19
7. 반복문 (for문, while문, do-while문, 디버깅표)  (0) 2021.01.18