Skip to content

Commit

Permalink
chapter 08 : 참조 자료형에 대해서 더 자세히 알아봅시다 공부 내용 정리 완료
Browse files Browse the repository at this point in the history
# `chapter 08 : 참조 자료형에 대해서 더 자세히 알아봅시다` 공부 내용 정리 완료

---

<<< Merge remote-tracking branch 'origin/main' into test
- `gitignore` 에 `.vscode/` 추가

---

* 공부 내용 동기화 `commit`

* 문서 형식 수정

* 내용 추가 및 틀린 내용 수정

- 문서 형식 수정
- 관련 내용 추가
- 틀린 내용 수정 : `Java 의 예약어 / 키워드 정리`

* 공부 내용 동기화 `commit`

- `chapter 08 : 참조 자료형에 대해서 더 자세히 알아봅시다` 공부 내용 정리 완료

* 설명 추가

* `ch_07 solution` 빈 `Reference` 삭제

* 이전 참고 자료 이름 수정
  • Loading branch information
jbw9964 authored Feb 17, 2024
1 parent e2e3e2d commit 6bbdbb1
Show file tree
Hide file tree
Showing 14 changed files with 408 additions and 1 deletion.
4 changes: 4 additions & 0 deletions scripts/ch_01/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,15 @@
- [`6. 한 줄을 의미하는 세미콜론`](./section_06_07.md)
- [`7. 모든 프로그래밍 언어에는 예약어라는 것이 있어요`](./section_06_07.md)

---

### Extra

- [`Java 가 실행되는 과정`](./extra/how_does_java_works.md)
- [`Code Runner Extension 으로 Java 실행시 문제점`](./extra/java_code_runner_extension_error.md)

---

### What I learned from this chapter

해당 챕터에서 크게 배운점은 없다. 그나마 `C/C++` 처럼 단어 사이 공백, `indentation` 이 문법과 관계 없는 점을 알게되었다.
Expand Down
2 changes: 2 additions & 0 deletions scripts/ch_02/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
- [`4. main 메소드를 만들자`](./section_04_06.md)
- [`6. 주석 (Comment) 처리하기`](./section_04_06.md)

---

### What I learned from this chapter

기본적으로 알고있는 내용과 많이 겹쳐 크게 배운 내용은 없다. 다만 `Java` 에서는 [`JavaDoc`](https://en.wikipedia.org/wiki/Javadoc) 이라는 문서화 프로그램이 있다는 걸 알게되었다.
4 changes: 4 additions & 0 deletions scripts/ch_03/README.md
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@

### Chapter 03 : 자바를 제대로 알려면 객체가 무엇인지 알아야 해요

---

### Extra

- [`Java 의 예약어 / 키워드 정리`](./extra/reserved_words_in_java.md)
- [`Java 와 C++ 에서의 default constructor`](./extra/difference_of_default_constructor_in_java_and_cpp.md)

---

### What I learned from this chapter

이번 챕터는 정말 배운게 없다. 이미 `C++` 에서 충분히 알고 있는 내용들이었다.
Expand Down
1 change: 0 additions & 1 deletion scripts/ch_03/extra/reserved_words_in_java.md
Original file line number Diff line number Diff line change
Expand Up @@ -224,7 +224,6 @@ SubClass example = new SuperClass();
```

- 객체 `example``comiple-time type``SubClass` 이며, `runtime type``SuperClass` 이다.
`(+ 위 코드를 실행할 시, 참조형 간 타입 캐스팅이 일어나 SuperClass 에 속한 변수는 모두 없어진다)`

---

Expand Down
2 changes: 2 additions & 0 deletions scripts/ch_04/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
- [`2. 예제를 통해서 지역 변수를 확실히 익히자`](./section_02_05.md)
- [`5. 기본 자료형은 8 개에요`](./section_02_05.md)

---

### What I learned from this chapter

이번 챕터에서 ~~드디어~~ `Java` 의 자료형에 대한 설명이 나왔다. 지금까지 추가로 검색하며 공부했어서 크게 어렵거나 한 내용은 없었다.
Expand Down
2 changes: 2 additions & 0 deletions scripts/ch_05/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
- [`7. 아주 특이한 ? : 연산자`](./section_03_07.md)
- [`8. 기본 자료형의 형 변환을 이용한 변신`](./section_08.md)

---

### What I learned from this chapter

이번 챕터에서 `Java` 의 연산자와 관련된 내용을 배웠다. 더불어 타입 캐스팅에 대해 살짝 알아봤는데, 신기하게도 `Java` 에서는 `boolean``C/C++` 과 조금 다르게(?) 취급 받는 것 같다.
Expand Down
2 changes: 2 additions & 0 deletions scripts/ch_06/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
- [`3. 자바의 switch 와 불켜는 스위치는 별 상관 없다`](./section_03_06.md)
- [`6. 많이 사용 안하는 label`](./section_03_06.md)

---

### What I learned from this chapter

이번 챕터에서 `switch` 구문이 나왔다. 놀랍게도 `C/C++` 과 다르게 `String` 을 이용해 `switch` 구문을 사용할 수 있다 한다.
Expand Down
67 changes: 67 additions & 0 deletions scripts/ch_07/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,76 @@
- [`5. 별로 사용하지는 않지만, 알고 있어야 하는 2 차원 배열`](./section_05_07.md)
- [`7. 배열을 위할 for 루프`](./section_05_07.md)

---

### What I learned from this chapter

이번 챕터에서는 `Java` 의 배열을 배웠다. `Java` 의 다차원 배열은 `"정말로 배열의 배열"` 인 것을 확인하였고, `enhanced for loop` 를 이용해 보았다.

또한 추가로 `Java``PrintStream` 에 객체가 출력되는 방식을 정리하였고, 아직 정리하진 않았지만 `Python` 처럼 자료구조를 위한 `collection` 이 존재하는 것을 알게 되었다.

---

\+ 추가로 어쩌다 다음과 같은 상황을 생각하게 되었다.

```java
class SomeClass {
int value;
}

SomeClass test_Class1 = new SomeClass();
SomeClass test_Class2 = new SomeClass();

Object[] some_array = new Object[2];
some_array[0] = test_Class1;
some_array[1] = test_Class2;

System.out.println(test_Class1 + "\t" + test_Class2);
System.out.println(some_array[0] + "\t" + some_array[1]);

// Unresolved compilation problem: value cannot be resolved or is not a field
// System.out.println(some_array[0].value);
```
```
SomeClass@7344699f SomeClass@6b95977
SomeClass@7344699f SomeClass@6b95977
```

갑자기 문뜩 `"Object[] 를 이용해 객체를 담으면 배열의 타입이 Object 여야 하니까 의도치 않은 타입 캐스팅이 일어나 value 인스턴스가 없어지는 거 아닌가?"` 라는 생각이 들었다. 그래서 한번 확인해 봤는데 놀랍게도 `some_array[0], [1]` 모두 `SomeClass` 타입인 것을 확인했다.

더군다나 `some_array[0].value` 와 같이 실행하였을 때는 컴파일 에러가 발생했다. `(제대로 실행시키려면 ((SomeClass) some_array[0]).value 로 적어야 했다)`

이를 바탕으로 추측하면 다음과 같이 정리할 수 있다.
`"어느 객체가 다른 객체를 참조 가능하다면, 참조하는 것은 유지하지만 이를 자신의 타입인 것으로 간주한다"` 라는 것이다.

다음 예시를 보자.

```java
class SupClass {
int value_sup = 1;
}
class SubClass extends SupClass {
int value_sub = 2;
}

SubClass sub_class = new SubClass();
sub_class.value_sup = 11;
sub_class.value_sub = 22;

SupClass sup_ref = (SupClass) sub_class;

System.out.println(
((SubClass) sup_ref).value_sup
+ " " +
((SubClass) sup_ref).value_sub
);
```
```
11 22
```

`sup_ref` 는 타입 캐스팅 하여 `sub_class` 를 참조하고 있다. 그런데 이를 다시 캐스팅하여 `value_sup``value_sub` 를 확인해보면 값이 전혀 바뀌지 않은 것을 확인할 수 있다.

타입 캐스팅이 이뤄져도 정보 손실(?) 이 일어나지 않은 것이다. 따라서 `sup_ref``sub_class``"자신의 타입인 것으로 간주할 뿐, 참조는 제대로 하고 있다"` 는 것을 확인했다.

이전에는 타입 캐스팅이 일어나면 이전에 속한 정보가 모두 없어질 수 있다고 알고 있었다. 이를 정확히 바로 잡을 수 있었다.
16 changes: 16 additions & 0 deletions scripts/ch_08/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@

### Chapter 08 : 참조 자료형에 대해서 더 자세히 알아봅시다

- [`2. 기본 생성자`](./section_02_09.md)
- [`9. static 블럭`](./section_02_09.md)
- [`10. Pass by value, Pass by reference`](./section_10_11.md)
- [`11. 매개 변수를 지정하는 특이한 방법`](./section_10_11.md)


### What I learned from this chapter

이번 챕터에는 그나마 흥미로운 내용들이 있었다. 디자인 패턴과 관련된 내용도 살짝 나왔고, `Arbitary Number of Arguments` 도 나왔다.

`Arbitary Number of Arguments` 를 이용한 `System.out.printf` 메서드도 활용해 보았고, `static block` 에 대한 몰랐던 사실 또한 알게 되었다.

그리고 나중에 디자인 패턴도 공부해야 된다는 사실을 상기할 수 있었다.
69 changes: 69 additions & 0 deletions scripts/ch_08/code/ManageStudent.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package scripts.ch_08.code;

interface Required_methods_1 {
String toString();
}

class Student implements Required_methods_1 {
private String name, address, phone, email;
private String[] Array = {
name, address, phone, email
};

public Student(String ... args)
{
for (int i = 0; i < args.length; i++)
{
this.Array[i] = args[i];
}
}

@Override
public String toString()
{
String concateString = "";
for (String var : Array)
{
if (var != null) {concateString += var + " ";}
else {concateString += "None ";}
}

return concateString;
}
}

interface Required_methods_2 {
Student[] addStudents();
}

public class ManageStudent implements Required_methods_2 {
public static void main(String[] args) {
ManageStudent test = new ManageStudent();
Student[] student = test.addStudents();

test.printStudents(student);
}

@Override
public Student[] addStudents()
{
Student[] student = new Student[3];
student[0] = new Student("Lim");
student[1] = new Student("Min");
student[2] = new Student(
"Sook", "Seoul",
"010xxxxxxxx", "ask@godofjava.com"
);

return student;
}

public void printStudents(Student ... students)
{
for (Student single_student : students)
{
System.out.println(single_student);
}
}
}

44 changes: 44 additions & 0 deletions scripts/ch_08/code/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@

### Chapter 08 : 참조 자료형에 대해서 더 자세히 알아봅시다 - 정리해 봅시다.

- `[1]` : `Student` 라는 클래스를 만들고, `name`, `address`, `phone`, `email` 이라는 인스턴스 변수를 `String` 타입으로 선언하자.
- `[2]` : 학생의 정보에 이름은 반드시 입력되어야 하므로, `name` 을 받아서 인스턴스 변수에 할당해 주는 `Student` 클래스의 생성자를 만들자.
- `[3]` : 모든 학생의 정보를 생성하면서 할당하는 `name`, `address`, `phone`, `email` 을 매개 변수로 받아 인스턴스 변수에 할당하는 `Student` 클래스의 생성자를 만들자.
- `[4]` : 다음과 같이 학생의 정보들을 `String` 으로 리턴하는 `toString()` 이라는 메서드를 만들자.

```java
public String toString() {
return name + " " + address + " " + phone + " " + email;
}
```

- `[5]` : 학생 정보를 담아두는 `Student` 클래스는 다 작성했으니, 학생들을 관리하는 `ManageStudent` 라는 클래스를 만들자.
- `[6]` : `ManageStudent` 클래스에 `main()` 메서드를 만들자.
- `[7]` : 다음과 같이 배열을 매개 변수로 받아 학생의 정보를 담은 후 리턴하는 메서드를 만들자.

```java
public Student[] addStudent() {
Student[] student = new Student[3];
student[0] = new Student("Lim");
student[1] = new Student("Min");
student[2] = new Student(
"Sook", "Seoul",
"010xxxxxxxx", "ask@godofjava.com"
);

return student;
}
```

- `[8]` : `main()` 메서드에서 `student` 라는 이름을 갖는 `Student` 배열을 만들고, 별도의 초기화는 하지 말고, `null` 로 할당하자.
- `[9]` : `main()` 메서드에서 `addStudent()` 메서드를 호출하고, 그 결과를 `student` 객체로 받자.
- `[10]` : `student` 객체의 내용을 출력할 `printStudents()` 라는 메서드를 만들고, 매개 변수로는 `student` 객체를 받을 수 있도록 하자.
- `[11]` : `printStudents()` 메서드에서 `for` 문을 사용하여 `student` 배열의 각각의 내용을 출력하자.
- `[12]` : `main()` 메서드에서 `printStudents()` 메서드를 호출하자.
- `[13]` : `ManageStudent` 클래스를 컴파일 한 후 실행해보자. 결과는 다음과 같이 출력되어야 한다.

```
Lim null null null
Min null null null
Sook Seoul 010xxxxxxxx ask@godofjava.com
```
13 changes: 13 additions & 0 deletions scripts/ch_08/code/solution.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@

### Chapter 08 : 참조 자료형에 대해서 더 자세히 알아봅시다 - 정리해 봅시다.

- [`문제 설명`](./README.md)

---

대부분 문제에서 요구한 대로 구현하였다. 그래도 심심해서 `Student` 의 인스턴수 변수를 담을 배열을 선언하고, 생성자 호출 시 이를 이용하는 방식을 사용했다. `(임의 개수 parameter 이용)`

그리고 `ManageStudent` 에서 각 학생들의 정보를 출력하라 하였는데, `Student` 에서 `toString` 메서드를 만들은 것을 이용하였다.

`(toString 메서드가 존재할 시, 해당 객체를 출력하면 toString 의 반환값으로 출력된다)`
[`(이전 Chapter 7 : 3. 배열을 그냥 출력해보면 어떻게 나올까? 설명 참조)`](../../ch_07/section_01_03.md#3-배열을-그냥-출력해보면-어떻게-나올까)
Loading

0 comments on commit 6bbdbb1

Please sign in to comment.