안녕하세요 자바칩 프라푸치노입니다.
오늘은 자바에서 객체 지향 개념1번 클래스와 객체에 대해 알아보겠습니다.
이제껏 포스팅했던 이론들은
라인 순서대로 코드가 진행되는 절차지향 이었다면
이제부터는 코드가 여기갔다 저기갔다하는 객체지향 개념입니다.
처음접하시는 분은 아직 무슨 말인지 이해가 안될 수도 있습니다.
1. 객체지향 언어의 역사
간단하게 알아보고 가겠습니다.
- 과학, 군사적 모의실험(simulation)을 위해 컴퓨터를 이용한 가상세계를 구현하려는 노력으로부터
객체지향이론이 시작됨
- 1960년대 최초의 객체지향언어 Simula탄생
-1980년대 절차방식의 프로그래밍의
한계를 객체지향방식으로 극복하려고 노력함.(C++, Smalltalk과 같은 보다 발전된 객체지향언어가 탄생)
- 1995년 말 Java탄생. 객체지향언어가 프로그래밍 언어의 주류가 됨.
2. 객체 지향 언어의 특징
- 기존의 프래그래밍 언어와 크게 다르지않고 몇 가지 규칙을 추가한 것이다.
- 코드의 재사용성이 높다
- 코드의 관리가 용이하다
- 신뢰성이 높은 프로그램의 개발을 가능하게 한다.
특징에는 이렇게 있는데
굳이 외우거나 하지 않아도 배우면서 저절로 이해가 되실 것입니다. ㅎㅎ
3. 클래스와 객체
클래스와 객체를 정의를 하자면
클래스- 객체를 정의해 놓은것
클래스 용도 - 객체를 생성하는데에 사용된다.
객체 - 실제로 존재하는 것. 사물 또는 개념
객체의 용도 - 객체의 속성과 기능에 따라 다름
이렇게 정의를 할 수 있는데요
쉽게 말하자면 클래스는 붕어빵 기계라고 생각하시면 됩니다.
모양이 다 정해져있고 틀이 정해져 있는 것이죠.
그리고 붕어빵 기계는 붕어빵이 만들어지지 않으면 쓸모가 없죠
붕어빵이 객체라고 생각하시면 됩니다.
그 붕어빵 틀에서 계속 계속 독립적인 붕어빵을 찍어낼 수 있습니다.
4. 객체와 인스턴스
객체(Object)와 인스턴스(Instacne)는 비슷한데 객체가 인스턴스를 포함합니다.
인스턴스는 클래스로부터 만들어진 붕어빵입니다.
5. 객체의 구성요소- 속성과 기능
객체는 속성과 기능으로 이루어져있습니다.
속성은 변수로, 기능은 메서드로 정의합니다.
TV라고 치면
TV의 가로, 세로 , 색상, 크기, 등등이 있는데 이것을 변수로 정의하고
TV에서 끄기, 켜기, 볼륨 조정, 채널 조정 등을 기능이라고 하고 메서드로 정의한다는 것입니다.
이 외에 구성요소에는 생성자가 있는데
속성과 기능은 없어도 되는데
무조건 생성자는 있어야합니다.
생성자는 다음 이론 포스팅에서 배워볼 예정입니다.
6. 인스턴스의 생성과 사용
이 부분은 이제 코드를 보면서 알아보겠습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
package Sec01_exam;
public class Student {
String name = "박보검";
int age = 30; //멤버변수(=필드)
@Override
public String toString() {
return "이름 :" + this.name + "," + "나이 :" + this.age;
}
}
|
cs |
클래스 명은 Student이구요
여기는 main메서드가 없습니다.
이유는 이것은 설계도 , 붕어빵 틀이지 실행을 하는 공간이 아니기 때문입니다.
멤버 변수는
String name = "박보검";
int age = 30;
이구요 멤버 메서드는
toString이 오버라이딩 되어있네요.
메서드에서 자세히 보시면
public String toString(){
return 샬라샬라; }
이렇게 되어있습니다.
여기서 public은 접근 제어자
String은 리턴타입
toString은 메서드 명
() -> 매개변수(여기서는 매개변수 없음)
입니다.
이 메서드 이름은 toString이고
어디서든 이 메서드에 접근하여 사용할 수 있고(public)
이 메서드를 호출하면 String타입으로 return뒤의 코드가 출력된다. 이런 뜻입니다.
* 접근제어자
1. private : 같은 클래스 내에서만 접근 가능
2. protected : 같은 패키지, 다른 패키지 자손 클래스에서만 접근 가능
3. default : 같은 패키지, 다른 패키지 접근 가능
4. public : 어떤 클래스나 다 접근 가능
접근 제어자는 이렇게 4가지가 있습니다.
toString 메서드를 보시면 this.name / this.age
가 있습니다.
this는 클래스 자기 자신의 주소를 가지고 있습니다.
쉽게 말해서 이 클래스 안의 멤버 변수를 가르키는 것입니다.
this가 활성화되는 시점은 new라는 연산자로 인스턴스가 만들어지면 활성화됩니다.
이제 main메서드를 가진 클래스 StudentEx를 만들어보았습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
public class StudentEx {
public static void main(String[] args) {
Student student = new Student();
System.out.println(student.toString());
student.name = "제니";
student.age = 25;
System.out.println(student.toString());
}
}
|
cs |
이렇게 Student 클래스로 new연산자를 통해 새로운 인스턴스를 만들었습니다.
그러면 메모리 상에서 어떻게 되냐하면
요런 객체가 만들어진다는 것입니다.
그러면 아까전에 Student 클래스로 각보시면
이름 박보검, 나이 30인 student가 하나 만들어지는 것입니다.
메서드를 호출할때는 인스턴스명.메서드명으로 호출해주어야합니다.
그래서 toString을 호출하면
아까 오버라이딩했던 toString이 호출이 되겠죠.
이렇게요
그리고 밑에 코드를 보시면
student안에있는 멤버변수 name에다가 값을 "제니"라고 넣어주고 있고
age에 25를 넣어주었으니
참조하고 있던 박보검과, age에 저장되어있던 30 이 바뀌겠죠.
그렇게 출력을 해보면
이렇게 나왔습니다.
그렇다면 아까는 멤버변수의 값들을 초기화를 해주었지만
초기화를 하지않고 선언만 한다면 어떻게 출력이 되는지 봅시다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
public class FieldInitValue {
//클래스의 3대 구성요소 - 생성자, 멤버변수(옵션), 멤버 메서드 (옵션)
//멤버 변수(=필드) - 속성을 나타내는 것
// 기본형
byte byteField;
short shortField;
int intField;
long longField;
float floatField;
double doubleField;
//참조형
int[] arr;
String str;
//toString()의 역할은 멤버변수(필드)의 값들을 수시로 확인하고자 할때나,
//자신의 형식대로 출력을 원할때 toString()오버라이딩을 한다.
@Override
public String toString() {
return "TOSTRING()"; //toString을 하면 이 문구가 나온다.
}
}
|
cs |
기본형 변수와 참조형 변수를 선언하고 초기화를 아무것도 해주지 않았습니다.
그러면 예상하기로 기본값으로 초기화되어있음을 예상할 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
public class FieldInitValueEx {
public static void main(String[]args) {
//아래 코드는 FieldInitValue인스턴스를 하나 힙에다가 만드는 것
//fValue는 그 인ㅇ스턴스의 주소를 알고있다. 하여, 위
//FieldInitValue 클래스의 멤버들에게 접근이 가능하다.
FieldInitValue fValue = new FieldInitValue();
String str = new String("자바");
System.out.println("기본형 변수");
System.out.println("byteField :" + fValue.byteField);
System.out.println("shortField :" + fValue.shortField);
System.out.println("intField :" + fValue.intField);
System.out.println("longField :" + fValue.longField);
System.out.println("floatField :" + fValue.floatField);
System.out.println("doubleField :" + fValue.doubleField);
System.out.println("-----------------------------------------------");
System.out.println("참조형 변수");
System.out.println("arrField :" + fValue.arr); //주소 초기화
System.out.println("referenceField :" + fValue.str);
System.out.println(fValue.toString()); //toString메서드를 문구로 설정해놓았음
System.out.println(str.toString()); //String의 toString은 실제값을 나타냄
}
}
|
cs |
이렇게 찍어보니
예상대로 기본형 변수는 0으로
참조형 변수는 null로 초기화가 되었습니다.
여기까지 클래스와 객체부분이론이었구요
다음 포스팅부터 실습을 해보도록 하겠습니다.
감사합니다 *^^*
'JAVA > java 이론' 카테고리의 다른 글
[자바JAVA]JVM의 메모리구조- 호출스택 (0) | 2020.10.08 |
---|---|
[자바JAVA] 객체지향개념2 - 변수와 메서드. 클래스변수. 인스턴스 변수. 지역변수. static메서드. 인스턴스 메서드 (0) | 2020.10.08 |
[자바 JAVA] 이차원 배열,int 2차원 배열, 향상된 for문 (0) | 2020.10.05 |
[자바JAVA]일차원 배열 , 배열의 길이, 배열의 선언방법, 배열 초기화, 배열 출력 (0) | 2020.09.26 |
[자바JAVA] 반복문 for문, while문 , do while, continue, break (0) | 2020.09.22 |