Chapter 6-2 . 필드 && Chapter 6-3. 생성자
📌 1. 필드
- 필드는 객체 고유의 데이터, 객체가 가져가야 할 부품 & 현재 상태 데이터를 저장하는 곳이다.
- 클래스에 포함된 변수를 의미하며, 객체의 속성을 정의할 떄 사용한다.
- 필드는 초기값을 주더라도 자동으로 초기화되며, 객체 외부에서 접근 시 객체를 생성하고 참조 변수를 통해 사용해야한다.
🔔 ) 자바에서 변수는 클래스 변수, 인스턴스 변수, 지역 변수가 있는데 이 중 필드라 부르는건 클래스 변수와 인스턴스 변수이다.
- 클래스 변수와 인스턴스 변수 :
- 이 둘은 static 키워드의 유무로 구분하는데 Static 키워드가 함께 선언되면 클래스 변수 / 그렇지 않은 것은 인스턴스 변수이다.
class Card {
String kind ; // 카드의 무늬 - 인스턴스 변수
int number; // 카드의 숫자 - 인스턴스 변수
static int width = 100 ; // 카드의 폭 - 클래스 변수
static int height = 250 ; // 카드의 높이 - 클래스 변수
}
위 카드 클래스를 예로 클래스 변수와 인스턴스 변수의 차이를 알아보자면
우선 카드는 자신만의 무늬 (하트, 다이아몬드 등)와 숫자를 카드별로 다르게 가지고 있지만,
각 카드들의 크기(폭, 높이)는 모든 인스턴스가 공통적으로 같은 값을 유지해야한다.
인스턴스 변수는 인스턴스가 생성될 때 마다 생성되므로, 인스턴스가 각기 다른 값을 유지할 수 있지만
클래스 변수는 모든 인스턴스가 하나의 저장 공간을 공유 하므로 항상 공통적인 값을 같게되어 위와 같이 구별하여 사용하는것이다.
여기서 Static 키워드란?
- java에서는 필요할때 클래스를 만들고, 사용할때는 생성자를 통해서 객체를 만들어서 사용하는데, 이러한 방식에서 문제가 생길때가 있다.
- 위 그림으로 예를 들어 보자면? 3명의 구매자는 2개의 사과가 있는것을 알고 있다.
- 구매자 A는 사과 객체를 생성해서 사과를 구매하고, B도 사과 객체를 생성하여 사과를 구매하고, C도 사과 객체를 생성하여 사과를 구매한다.
- 그럼 실제로는 사과는 2개 밖에 없지만 3명의 구매자가 사과를 구매하게 되는 버그 상황이 발생하는것이다.
- 이때 static 키워드를 사용하여 사과 판매대의 정보를 공유하면 이 버그를 해결할 수 있게 된다.
Static 키워드를 사용하는 법
1. 마켓 클래스
public class market {
public static int apple = 2;
public appleSales() {
}
}
2. 구매자 A의 클래스
public class firstCustomer {
public class firstCustomer() {
}
public void getApple(int apple){
appleSales.apple = appleSales.apple - apple; // static으로 선언할 경우 객체를 생성하지않고 클래스 이름을 통해 접근이 가능해짐
if(market.apple < 0){
System.out.println("사과 재고 업승")
}
}
}
**/ 만약에 사과가 static으로 선언된게 아니였다면 19라인은 아래와 같이 작성해야 사용 할 수 있음
market marketApple = new market();
market.apple;
3. main 클래스
public class Main {
public static void main(String[] args){
firstCustomer firstCustomer = new firstCustomer();
firstCustomer.getApple(1);
SecondCustomer secondCustomer = new SecondCustomer();
secondCustomer.getApple(1);
.. 세번쨰 사용자 동일
}
}
Static 키워드는 위와 같이 사용할 수 있고, 아래와 같은 경우에 사용한다.
Static 키워드 사용 용도
- 클래스를 설계할 때, 멤버 변수 중 모든 인스턴스에 공통적으로 사용해야 하는것에만 static을 사용한다.
- 인스턴스를 생성하면, 각 인스턴스들은 서로 독립적기 때문에 서로 다른 값을 유지한다. 경우에 따라서는 각 인스턴스들이
공통적으로 같은 값이 유지되어야 하는 경우 static을 붙인다. - Static이 붙은 멤버 변수는 인스턴스를 생성하지 않아도 사용할 수 있다.
- static이 붙은 멤버변수(클래스변수)는 클래스가 메모리에 올라갈때 이미 자동적으로 생성되기 때문인데 이와 같은 이유때문에
공통적으로 값을 유지해야하는 인스턴스가 아닐경우 메모리 과 사용을 할 수 있기 때문에 사용시 고려해야한다.
*). Static 사용 지침
- 클래스의 멤버변수 중 모든 인스턴스에 공통적인 값을 유지해야하는것이 있는지 살펴보고, 있으면 Static을 붙여준다.
- 작성한 메서드 중 인스턴스 변수를 사용하지 않는 메서드에 대해서도 Static을 붙일것을 고려한다.
내용 참조 : https://vaert.tistory.com/101
📌 2. 생성자
- 생성자는 인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메소드'이다.
- 주로 일반 멤버 변수의 초기화나, 객체를 생성할 때 실행하는 작업을 정리하며 리턴값이 없다.
- 생성자는 클래스내에 선언되고, 타입이 다를 경우 오버로딩이 가능하므로 하나의 클래스에 여러개의 생성자가 존재할 수 있다.
🔎 그럼 생성자는 왜 쓸까?
- 찾아보니 자바의 창시자가 FM 그 잡채여서 그렇게 설계 한 것 같다 생성자로 변수를 초기화하고, 메서드는 기능만 담당하도록 ?..
2.1 기본 생성자(+New 키워드)
- 우리는 생성자를 사용하지 않았음에도, java 사용에 문제가 없었는데 그 이유는 new 키워드가 그 역할을 해주었기 때문이다.
- 별도의 생성자를 만들지 않았을 때 컴파일러에 의해 자동으로 생성자가 만들어지는데 이를 기본 생성자 라고 한다.
( 생성자를 만들지않았지만 new라는 키워드를 통해서 BasicConstructor person = new BasicConstructor()를 통해서 자동으로 public BasicConstructor() {} 기본연산자가 생성된다고 함)
public class market {
String name;
int value;
// public market() {} // 생략된 기본 생성자
public static void main(String[] args){
market product = new market(); //new연산자가 Market을 호출하면 컴파일러가 자동으로 기본 생성자를 만든다.
product.name = "Apple"; // 기본 생성자 이므로 외부에서 객체의 멤버 변수를 설정해야한다.
Product.value = 3;
}
}
위에서 생성한 생성자는 기본 생성자로, 외부에서 객체의 멤버 변수를 설정해주어야하는데 매개 변수가 있는 생성자를 사용한다면,
원하는 인스턴스를 생성함과 동시에 원하는 값으로 초기화를 할 수 도 있음!
2.2 생성자 VS Void 메서드
- 생성자는 형태가 없는 void 메서드와 비슷하게 생겼는데 이들은 어떠한 차이가 있을까?
- 차이점 : 이름과 역할
(1) 이름 : 생성자는 class 명과 똑같아야하고, 메서드는 달라야함
(2) 역할 : 메서드는 다양한 기능들을 담당하는 역할이지만, 생성자는 멤버변수의 초기화만을 담당한다.
2.3 This 키워드 -this()와 this
- this에는 두가지 용법이 있는데, 아래와 같다.
- this는 현재 객체를 참조하기 위한 용도 / this()는 다른 생성자를 호출하는 용도이다.
// 1. This 미사용
public class ThisPerson {
String name;
int age;
boolean isHugry;
ThisPerson(String name, int age, boolean isHungry){
name = name; //컴파일러가 첫번째 name은 멤버변수로 두번째 Name은 매개변수로 구별을 하지 못한다.
age = age;
isHungry = isHungry;
}
}
// 2. This 사용
public class ThisPerson {
String name;
int age;
boolean isHugry;
ThisPerson(String name, int age, boolean isHungry){
this.name = name; // 매개변수로 받은 this.name을 출력하는 코드이다.
this.age = age;
this.isHungry = isHungry;
}
public static void main(String[] args) {
ThisPerson person = new ThisPerson("홍지민", 20, true);
System.out.println(person.print());
}
}
- this는 객체에 대한 참조값이기 때문에 객체가 생성되기 전에는 사용할 수 없다.
다른 생성자를 호출할때 사용하는 This()
- 자바는 다양한 방법으로 객체를 생성할 수 있도록 생성자 오버로딩을 제공한다.
- 생성자 오버로딩이란, 파라미터를 다르게 해서 여러개의 생성자를 정의하는것을 말한다.
- 생성자 오버로딩이 많아 질 경우 생성자 간의 중복 코드가 발생할 수 있는데 (=매개변수 수만 달리하고 필드 초기화 내용이 비슷할 때 )
- 필드 초기화 내용은 한 생성자에만 집중적으로 사용하고, 나머지는 초기화 내용을 가진 생성자를 호출한다.!
public class OverloadConstructorPerson {
String name = "한사장";
int age = 90;
boolean isHugry = false;
OverloadConstructorPerson(String name, int age, boolean isHungry){
//아래 3줄의 중복코드가 발생함.
this.name = name;
this.age = age;
this.isHugry = false;
}
OverloadConstructorPerson(String name, int age){
//this()용법사용
this(name, age, false);
}
}
'✏️ Java' 카테고리의 다른 글
| 혼공자 | Chapter 6 . 클래스 5️⃣ (0) | 2022.11.30 |
---|---|
| 혼공자 | Chapter 6 . 클래스 4️⃣ (0) | 2022.11.29 |
| 혼공자 | Chapter 6 . 클래스 3️⃣ (0) | 2022.11.28 |
Java | Extend와 Implements(인터페이스) (0) | 2022.11.25 |
| 혼공자 | Chapter 6 . 클래스 (0) | 2022.11.22 |