일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- dataframe
- google apps script
- django
- Mac
- SQL
- gas
- matplotlib
- string
- Google Excel
- Apache
- Java
- Kotlin
- PANDAS
- Google Spreadsheet
- GIT
- math
- Excel
- hive
- c#
- Tkinter
- numpy
- 파이썬
- PostgreSQL
- Redshift
- Github
- array
- PySpark
- Python
- list
- Today
- Total
달나라 노트
Java - object (객체) 본문
class의 개념에 대해 이해해봅시다.
객체 지향적, 객체, class 등은 단순히 어떤 프로그램의 로직을 나열하는 것이 아닌 사람이 사물을 보는 시각처럼 프로그램을 구성하는 것입니다.
예를 들어봅시다.
가장 많이 드는 예시는 동물입니다.
'동물' 이라는 것은 class와 같습니다.
그리고 '동물' 이라는 것에는 고양이, 강아지, 새 등등의 여러 종류가 있죠. 이런 것을 객체(object)라고합니다.
그리고 고양이나 강아지, 새 등은 각각의 속성(이름, 색, 크기 등)을 가지고 있습니다. 이런 것을 객체 변수 또는 흔히 속성(attribute)라고 합니다.
그리고 고양이나 강아니, 새에 대한 행동적인 특징이 있을겁니다. 울음 소리, 달리는 모습, 나는 모습 등. 이런것을 method라고 합니다.
class(동물) 안에는 여러 object(고양이, 강아지, 새)가 있습니다.
그리고 각각의 object(고양이, 강아지, 새) 안에는 객체의 특징 정보를 담고있는 attribute(색, 크기, 형태 등)가 속해있으며, 객체의 행동(기능)을 담고있는 method가 속해있습니다.
public class Animal {
String name;
String color;
int weight;
public static void main(String args[]) {
Animal cat = new Animal();
System.out.println(cat.name);
System.out.println(cat.color);
System.out.println(cat.weight);
Animal dog = new Animal();
System.out.println(dog.name);
System.out.println(dog.color);
System.out.println(dog.weight);
}
}
-- Result
null
null
null
null
null
null
위 코드는 가장 위에서 예시로 들었던 동물이라는 class를 선언해본 것입니다.
Animal class를 선언하고 Animal이라는 class가 필요로 하는 변수들(name, color, weight)을 만들었습니다. 이것을 객체변수라고 부릅니다.
객체 변수 말고도 위에서 인스턴스 변수, 속성이라고도 말합니다.
그리고 main method 안을 보면 Animal이라는 class를 활용하여 cat, dog 객체를 생성하고 있습니다.
객체 생성 시에는 아래와 같은 구문을 사용합니다.
Animal cat = new Animal();
이걸 해석해 보면 다음과 같습니다.
Animal cat -> cat이라는 객체를 만들고 이 cat 객체의 data type은 Animal class 자체입니다.
new Animal() -> 그리고 그 cat 객체가 가질 내용은 Animal class의 내용입니다.
class_name object_name = new class_name();
따라서 위와 같은 Syntax로 객체를 생성할 수 있고, new는 객체를 생성할 때 사용하는 키워드입니다.
Animal이라는 class는 name, color, weight라는 변수를 가지고 있으니 이 Animal class를 사용하여 만든 객체들도 당연히 name, color weight라는 변수를 가지고 있습니다.
그래서 위 예시에선 각 객체의 속성들을 출력해봤습니다.
cat.name이란 cat 객체의 name 속성을 가져오라는 뜻입니다.
다만 name, color, weight 변수에 아무것도 할당되지 않은 상태이므로 결과는 null값이 나옵니다.
public class Animal {
String name;
String color;
int weight;
public void setName(String name) {
this.name = name;
}
public void setColor(String color) {
this.color = color;
}
public void setWeight(int weight) {
this.weight = weight;
}
public static void main(String args[]) {
Animal cat = new Animal();
Animal dog = new Animal();
cat.setName("cat_A");
cat.setColor("Orange");
cat.setWeight(10);
dog.setName("dog_A");
dog.setColor("White");
dog.setWeight(20);
System.out.println(cat.name);
System.out.println(cat.color);
System.out.println(cat.weight);
System.out.println(dog.name);
System.out.println(dog.color);
System.out.println(dog.weight);
}
}
-- Result
cat_A
Orange
10
dog_A
White
20
그러면 생성된 객체에 값을 넣어봅시다.
그러기 위해선 Animal class에 객체 변수의 값을 설정하도록 해주는 method를 작성해야합니다.
위 예시에서는 setName, setColor, setWeight 3개를 만들었습니다.
setName method를 봅시다.
parameter로는 String name이 적혀있습니다. 즉, setName method를 실행시킬 때에는 String 데이터를 함께 전달해주어야 합니다.
그리고 setName method의 내부를 보면 this.name = name;이라는 내용이 적혀있습니다.
여기서 this를 이해해야하는데, this는 Animal class를 이용하여 만들어진 객체를 의미합니다.
즉, Animal class를 이용하여 cat객체를 만들 것입니다.(-> Animal cat = new Animal(); 이 부분입니다.)
이렇게 되면 this는 cat 객체를 의미합니다.
this.name = name; 의 의미는 cat.name = name;과 동일하며 cat객체의 name 속성에 setName method로부터 전달받은 name값을 할당하라는 뜻입니다.
다른것도 마찬가지입니다.
그리고 main method 쪽을 보면 cat, dog 객체를 Animal class를 통해 생성하고 있습니다.
Animal class에는 name, color, weight 3개의 객체변수와 setName, setColor, setWeight 3개의 method를 가지고 있으므로
이러한 Animal class에 의해 생성된 cat, dog 객체도 각각 name, color, weight 3개의 객체변수와 setName, setColor, setWeight 3개의 method를 가지게 됩니다.
그래서 각각의 객체는 소유한 method를 사용할 수 있는 것이죠.
cat.setName("cat_A"); -> cat 객체의 setName method를 활용하여 cat 객체의 name 속성에 값을 부여하고 있습니다.
여기까지 하고 실행해보면 할당한 값들이 출력되는 것을 보실 수 있습니다.
-- 의문 1. static의 의미.
지금까지 작성한 코드를 보면 public static ~~이라고 적은 것이 많았습니다.
여기서 static의 의미를 위 코드에서 볼 수 있습니다.
결론부터 말하자면 static을 적는다면 선언된 method가 class와 관련된 method라는 뜻이고,
static을 명시하지 않으면 그냥 다른 객체에 할당시킬 용도의 method라는 의미를 가집니다.
위 예시에서 setName, setColor, setWeight method는 Animal 이라는 class를 위한 것이 아니라
cat, dog같이 Animal class를 이용하여 만들어진 객체들을 위해, 이 객체들이 자신들의 속성값(name, color, weight)을 정할 수 있는 기능을 제공하기 위한 method입니다.
즉, Animal class와는 관련이 없죠. 따라서 static를 명시하지 않았습니다.
반대로 main method는 이 class가 선언될 때 실행되어야 하는 코드블록을 의미합니다.
(보통 프로그램에서 main method란 프로그램을 실제 실행시켜 어떤 output을 주는 method를 의미합니다.)
따라서 이 main method는 어떤 객체를 위한게 아니라 이 class자체를 위한 것이므로 main method에는 static이라는 키워드가 명시되어 있습니다.
-- 의문 2. 객체는 변수를 공유할까?
여기서 한 가지 의문점이 있습니다.
cat과 dog 모두 동일한 method(setName, setColor, setWeight)를 사용했습니다.
변수명도 모두 같죠.
그러면 dog 객체의 method를 cat보다 이후에 실행했으니 dog의 method가 동일한 변수명을 가진 cat 객체의 변수들을 다 덮어씌울 가능성은 없을까요?
답은 없습니다.
서로 다른 객체라면 동일한 class를 이용해 만들어졌다고 하여도 변수는 전혀 공유하지 않습니다.
public class Animal {
String name = "Cat_A";
public static void main(String args[]) {
Animal cat = new Animal();
System.out.println(cat.name);
}
}
-- Result
Cat_A
당연한 얘기겠지만 위처럼 Animal class의 객체 변수 name에 미리 Cat_A라는 값을 할당시켜놓으면
class를 이용해 객체를 생성할 때 생성된 cat이라는 객체는 name이라는 속성을 가지게 되며 이 속성값은 당연히 Cat_A입니다.
'Java' 카테고리의 다른 글
Java - ArrayList (0) | 2021.03.13 |
---|---|
Java - 2개의 class 선언, 객체 parameter (0) | 2021.03.13 |
Java - Recursion (0) | 2021.03.12 |
Java - Scope (0) | 2021.03.12 |
Java - method overloading (0) | 2021.03.12 |