초기화(Initialization)
우리가 학교에 가면 필기구를 꺼내고 강의노트를 준비하는 준비 과정과 같은 의미입니다.
어떤 일을 시작하기 전에 준비를 하듯 작업을 시작하기 위해서 값을 설정하거나 넣는 것을 의미합니다.
우리는 보통 초기화를 컴퓨터에 있는 모든 내용을 다 지워버린다고 생각해서 조금 혼란이 올 수도 있을 것 같습니다.
하지만 프로그래밍에서는 이것만 기억하면 될 것 같습니다.
데이터 객체 혹은 변수를 위해 초기값을 지정해주는 것
이를 테면 다음과 같겠죠
public class Test{
public static void main(String[] args) {
int a;
System.out.println(a);
}
}
여기서는 출력을 할 때 오류가 발생합니다. 왜냐하면 객체를 선언했지만, 초기값을 지정해주지 않아 오류가 발생하는 것입니다. 이를 테면 int a = 10; 이었다면, 결과는 정상적으로 10이 출력되었을 것입니다.
User user = new User();
이런 것도 객체화의 예시가 될 수 있습니다.
반면, a = 100; 과 같이 초기화 이후에 변경된 값을 지정해주는 것은 값을 할당(allocation)한다고 합니다.
이렇게 초기화를 시켜주는 이유는
클래스 영역에서 값을 할당해줄 경우 컴파일러(코드를 컴퓨터에 번역해주는 기능)가 자동으로 값을 할당해주지만,
메소드 영역에서 선언할 경우에는 자동으로 값이 할당되지 않아 오류가 발생하기 때문입니다.
클래스, 인스턴스, 객체
클래스
객체를 만들어내기 위한 틀, 자바에서는 클래스를 가지고 여러 객체를 생성하여 사용합니다.
구성
클래스는 객체의 상태를 나타내는 필드(field)와 객체의 행동을 나타내는 메소드(method)로 구성됩니다.
필드에는 클래스에 포함된 변수가 있습니다.
메소드는 특정 작업을 수행하기 위한 명령문의 집합을 의미합니다.
인스턴스(instance)
클래스를 바탕으로 선언된 객체
String greet = new String("hello world");
greet 변수 앞에는 기본형 타입이 아닌 String class가 젹혀있습니다.
' = ' 뒤에는 new 다음에 생성자가 있는 것.
new 라는 키워드에는 객체를 메모리에 올려준다. 메모리에 올라간 객체는 인스턴스!
greet 변수에는 메모리의 위치 값만 저장이 되는 것이고 어떤 메모리에 저장되어 있는지 알 수 있는 방법은 없습니다.
greet 변수는 단순히 String 인스턴스를 참조한다는 것만 인지하면 됩니다.
자바는 하나의 클래스에서 여러개의 인스턴스를 생성할 수 있습니다.
그렇게 생성된 인스턴스는 독립된 메모리 공간에 저장된 자신만의 필드를 가질 수 있습니다.
필드란, 객체가 가지고 있는 속성을 의미합니다. 노트북의 경우 (제조사,연도,모델명,가격)등의 정보를 가질 수 도 있겠죠. 이는 인스턴스간에 다른 정보를 가질 수 있습니다.
반면 해당 클래스의 모든 메소드는 해당 클래스에서 생성된 모든 인스턴스가 공유할 수 있습니다.
이는 인스턴스들이 같은 기능을 하고 있음을 의미합니다.
예시
클래스
노트북(Notebook)
필드
nt.brand = "apple"
nt.year = "2022"
nt.name = "macbook Pro M2"
nt.price = "2000000 won"
메소드
nt.boot()
nt.update()
인스턴스
동생 노트북 : 노트북 클래스로 생성된 인스턴스
엄마 노트북 : 노트북 클래스로 생성된 또다른 인스턴스
여기서 동생 노트북과 엄마 노트북은 모두 노트북의 필드와 메소드를 가질 수 있지만,
인스턴스마다 가지고 있는 변수 값은 독립된 메모리 공간에 자신만의 필드를 가지고 있을 것입니다.
객체(Object)
상태가 있고 행동을 하는 실체
클래스의 인스턴스, 클래스에 선언된 그대로 생성된 실체로 모든 인스턴스를 포괄하는 의미를 가지고 있습니다.
주의
클래스와 다른 점 : 클래스는 객체를 만들기 위한 틀이고, 객체는 클래스대로 생성할 모든 대상을 의미합니다.
인스턴스와 다른 점 : 객체는 소프트웨어 세계에 구현할 대상이고, 소프트웨어 세계에 구현된 실체가 인스턴스를 의미합니다.
코드로 다시 확인해보겠습니다.
/* 클래스 */
public class Animal {
...
}
/* 객체와 인스턴스 */
public class Main {
public static void main(String[] args) {
Animal cat, dog; // '객체'
// 인스턴스화
cat = new Animal(); // cat은 Animal 클래스의 '인스턴스'(객체를 메모리에 할당)
dog = new Animal(); // dog은 Animal 클래스의 '인스턴스'(객체를 메모리에 할당)
}
}
출처
http://www.tcpschool.com/java/java_class_intro
https://gmlwjd9405.github.io/2018/09/17/class-object-instance.html
생성자
생성자는 인스턴트가 생성 시 호출되는 인스턴스 초기화 메소드입니다.
생성자의 조건은 다음과 같습니다.
- 생성자의 이름은 클래스의 이름과 같아야 한다.
- 생성자는 리턴값이 없다. (프로그래머가 만들지 않으면 매개변수가 없는 생성자가 컴파일할 때 자동으로 만들어진다.)
- 객체 생성 시 한번만 호출된다.
- 하나의 클래스에 여러 개의 생성자가 존재할 수 있다.
- 매개변수가 없는 생성자를 기본생성자라고 한다.
- 여기에는 나와있지 않지만 생성자간 호출은 현재 객체, 자기 자신을 나타내기 위해 this를 사용한다.
생성자는 해야할 일을 줄일 수 있도록, 반드시 해야하는 것들을 놓치지 않는 역할을 합니다!
class Calculator {
int left, right;
public Calculator(int left, int right) { // 클래스와 동일한 이름인 메소드, 즉 생성자입니다.(void x)
this.left = left;
this.right = right;
}
// 클래스가 생성될 때에는 가장 먼저 생성자를 실행합니다.
// 생성자에서 매개변수 left, right 인자를 무조건 받을 수 있도록 하도록 강제하고
// 이를 행 2에서 전역 변수인 값으로 사용할 수 있도록 하고 있다.
// 이 생성자가 없으면 알아서 클래스에서 생성하게끔 합니다.
public void sum() {
System.out.println(this.left + this.right);
}
public void avg() {
System.out.println((this.left + this.right) / 2);
}
}
public class CalculatorDemo1 {
public static void main(String[] args) {
Calculator c1 = new Calculator(10, 20); // 여기서 Calculator는 클래스가 아닌 클래스의 생성자입니다.
// 즉, Calculator는 인스턴스를 생성하는 자. c1이 인스턴스!
c1.sum();
c1.avg();
Calculator c2 = new Calculator(20, 40);
c2.sum();
c2.avg();
}
}
오버라이딩
매개변수의 유형과 개수가 다르게 하여 같은 이름의 메소드를 여러개 가질 수 있게 하는 기술
plus 함수가 있는 경우
정수 두 개를 더하는 함수, 문자열 두개를 더하는 함수, 정수 세개를 더하는 함수를 같은 이름으로 만들 수 있다.
생성자 오버로딩
메소드와 마찬가지로 매개변수의 수와 타입이 다르다면 여러개의 생성자를 선언할 수 있다.
public class Phone{
String brand;
int price;
public Phone(){
}
public Phone(String brand){
this.brand = brand;
}
public Phone(){
this("브랜드 없음", 0);
}
public Phone(String brand, int price){
this.brand = brand;
this.name = name;
}
}
여기서
this() 안에 필요한 내용을 넣어 자신의 생성자를 호출한다.
자기 자신을 호출하기 때문에 비슷한 코드가 중복되어서 나오는 것을 방지한다.
비슷한 코드 예시
public Phone(){
this.brand = "브랜드 없음";
this.price = 0;
이렇게 쓰면 코드의 중복이 일어날 수 있다. 사용은 해도 되지만 코드를 중복 사용하게 되어 헷갈림;
'Java' 카테고리의 다른 글
| hashCode() 와 equals() 메서드 (0) | 2023.01.04 |
|---|---|
| JVM (0) | 2022.11.24 |
| SOLID 객체 지향 설계 (0) | 2022.10.13 |
| [JAVA] 공부하다 정리하는 기본 개념 2 (0) | 2022.08.18 |