-
[Java] 클래스, 객체(인스턴스)언어/Java 2024. 11. 4. 10:41
아래 내용은 김영한의 실전 자바 - 기본편에서 발췌했으며 더 자세한 내용은 아래 링크 섹션2와 3에서 자세히 볼 수 있습니다.
김영한의 실전 자바 - 기본편 강의 | 김영한 - 인프런
김영한 | 실무에 필요한 자바 객체 지향의 핵심 개념을 예제 코드를 통해 쉽게 학습합니다., 국내 개발 분야 누적 수강생 1위, 제대로 만든 김영한의 실전 자바[사진][임베딩 영상]단순히 자바 문
www.inflearn.com
[클래스]
package class1; public class Student { String name; int age; int grade; }
- class 키워드를 사용해 Student 클래스를 정의한다.
- 학생 클래스 내부에는 name, age, grade 변수를 가진다.
- 클래스 내부에서 정의한 변수들을 (name, age, grade) "멤버 변수" 또는 "필드" 라고 한다.
- 멤버 변수(Member Variable): 특정 클래스에 소속된 멤버
- 필드(Field): 데이터 항목을 가리키는 전통적인 용어
- 클래스는 대문자로 시작하고 낙타 표기법을 사용한다.
- class Student, class ProductOrder
[객체]
package class1; public class ClassStart3 { public static void main(String[] args) { Student student1; student1 = new Student(); // 객체 또는 인스턴스 student1.name = "학생1"; student1.age = 15; student1.grade = 90; Student student2 = new Student(); student2.name = "학생2"; student2.age = 16; student2.grade = 80; System.out.println("name: " + student1.name + " age: " + student1.age + " gradre: " + student1.grade); } }
- 타입은 데이터의 종류나 형태를 나타낸다.
- int a; 정수타입 / String str; 은 문자타입 ( 사실 String도 클래스이지만, 자주 사용되기 때문에 Java에서 특별히...)
- 여기서는 Student 이라는 사용자 정의 타입을 만든 것이다.
- 즉, 클래스를 사용해서 실제 메모리에 실체를 만들고 이를 "객체" 또는 "인스턴스" 라고 한다.
- 클래스는 설계도이고, 이 설계도를 기반으로 실제 메모리에 만들어진 실체를 객체 or 인스턴스 라고 한다. (객체 == 인스턴스)
- 여기서는 Student 클래스를 기반으로 student1, student2 객체(인스턴스)를 만들었다.
인스턴스 vs 객체
결론은 둘 다 같은 의미이지만, 인스턴스는 관계를 말할 때 주로 사용된다. 예를 들어 student1는 Studentd의 인스턴스야.
인스턴스: 특정 클래스로부터 생성된 객체를 의미
객체: 클래스에서 정의한 속성과 기능을 가진 실체[참조값 보관]
- 객체를 생성하면 자바는 메모리 "어딘 가"에 만들어 놓는다. 그리고 이 객체에 접근할 수 있는 참조값(주소)을 반환한다.
- 반환된 주소값을 student1 에 보관하여 이 변수를 통해 객체를 접근(참조)할 수 있게 되는 것이다.
[객체에 값 대입]
student.name = "학생1"; student.age = 27; student.grade = 80;
- 객체가 가지고 있는 멤버 변수에 값을 대입하려면 먼저 "객체에 접근"
- 0x001에 접근한다.
- . (점, dot) 키워드를 사용해서 값을 대입
[배열 도입]
영한 형님의 강조 말씀: 자바에서 대입은 항상 변수에 들어 있는 값을 복사해서 전달한다.
- 현재 Student[] students; 는 0x005를 가리키고 있다.
- 짱구네집 주소는 0x005이다. 그 집 주소 안에는 짱구방의 주소(0x001)와 짱아방의 주소(0x002)가 들어 있다.
- 짱구네집 주소 -> 짱구방의 주소를 가서 방 안에 뭐가 있나 봤더니 학생1에 대한 정보가 있었다.
[위 내용 이해 했나 문제]
문제1.
int a = 10; int b = a; System.out.println("a :" + a); System.out.println("b :" + b); a = 20; System.out.println("a :" + a); System.out.println("b :" + b); b = 30; System.out.println("a :" + a); System.out.println("b :" + b);
문제2.
// class Data public class Data { int value; } package ref; public class VarChange2 { public static void main(String[] args) { Data dataA = new Data(); dataA.value = 10; Data dataB = dataA; System.out.println("dataA 참조값: " + dataA); System.out.println("dataB 참조값: " + dataB); System.out.println("dataA value: " + dataA.value); System.out.println("dataB value: " + dataB.value); // dataA change dataA.value = 20; System.out.println("변경 dataA.value = 20"); System.out.println("dataA.value: " + dataA.value); System.out.println("dataB.value: " + dataB.value); // dataB change dataB.value = 30; System.out.println("변경 dataB.value = 30"); System.out.println("dataA.value: " + dataA.value); System.out.println("dataB.value: " + dataB.value); } }
.
.
.
.
.
.
.
[정답1]
10
10
20
10
20
30
[해설1]
- int a = 10;
- int b = a; // a의 값인 10을 복사해서 b에 넣는다.
- a가 b가 되는 게 아니다.
[정답2]
0x001 (주소를 의미함. 실제로 다른 값이 나오겠죠)
0x001
10
10
20
20
20
30
30
30
[해설2]
- dataA와 dataB는 현재 메모리상 같은 주소를 가리키고 있다. 쉽게 말해 dataA와 dataB는 둘 다 짱구네 집 주소를 가리킨다.
- 짱구네집에 누가 놀러왔다고 해서 짱구네집 주소가 바뀌진 않잖아 !! 그 안에 있는 내용물들이 바뀌는 것이지.
- 짱구네집에 들어갈 수 있는 루트가 여러 개가 되었다고 생각해보자. dataA길 dataB 길
- 그럼 그 길을 따라서 도착했을 때 안에 짱구네 어머니가 계실 수도 있잖아. 아니면 짱구네 아버지가 계실 수도 있고.
- 위 과정을 dataA 주소를 따라서 간 뒤 짱구를 넣는다. dataB도 짱구네 주소를 가리키니 짱구네 주소를 따라 갔더니 짱구가 있었다.
'언어 > Java' 카테고리의 다른 글
[Java] 변수와 초기화, null, nullPointerException (0) 2024.11.05 [Java] 기본형 vs 참조형 (0) 2024.11.05 [Java] 반환타입, 메서드 오버로딩 (0) 2024.10.30 [Java] 메서드 (feat. 인수 != 매개변수) (2) 2024.10.29 [Java] 배열, 향상된 for문 (0) 2024.10.28