백엔드 수업 #06 클래스 - 06 필드

sookyoung.k·2022년 11월 15일
1

하... 이제 필드는 조금 알 것 같아... 하지만 코딩을 공부하며 느끼는 건... 뭔가를 '안다' 라고 함부로 말을 해선 안 된다는 것임... 내가 알긴 뭘 알아... 알 것 같은 느낌만 조금 올 뿐, 내가 정말 뭔가를 아는 거라고 자신하기가 무섭다. 계속 너무 어려운 것들이 쳐튀어나옴... 암튼 해봅시다.


필드 = 객체의 고유 데이터, 객체가 가져야 할 부품, 객체의 현재 상태 데이터를 저장하는 곳

중요하니까 존나 크게 씀. 그리고! 멤버변수라고도 한다. 씌앙 자꾸 부르는 말이 하나둘 더 있어서 헷갈린다. 네 뭐라구요??? 하는 사람 됨. 멤버변수!!!

아이브라는 아이돌을 객체라고 하면 아이브를 이루는 멤버들(장원영, 안유진, 레이, 이서, 가을선배, 리즈)이 바로 멤버변수가 되는 것... 이고 필드에 저장된다. 필드에 데뷔한 객체. 아이돌식 이해.
근데 그럼 필드는 멤버 필드라고 해야 하는 것 아님? 멤버 변수는 객체에 연결된 변수 하나 아닌가? 암튼 수업할 때 대충 멤버변수라고 하면 필드(혹은 필드의 변수)라고 눈치껏 알아들으면 될 것 같다.

public class Car { // 자동차 클래스 
	// 객체의 고유 데이터
	String company; // 제작 회사
	String model; // 모델
	String color; // 색깔
	int maxSpeed; // 최고 속도
	
    // 객체의 상태
    int speed; // 현재 속도
	int rpm; // 엔진 회전 수
    
    // 객체의 부품
    Body body; // 차체
    Engine engine; // 엔진
    Tire tire; // 타이어
}

필드에 저장된 데이터들!
클래스를 설계할 때 이러한 정보들은 모드 필드로 선언이 되어야 한다.

사실 필드라는 개념을 처음 접했을 때 객체의 데이터를 저장한다는 것 보다... 필드요...? 그게 뭐고... 대체 왜 이걸 따로... 만드는거임?... 하고 어려웠던 것 같다. 객체라는 개념도 모호했구... 아직 '왜'를 찾은 건 아니지만 아하, 그렇구나! 하고 이해하고 (현실에 순응하고?...) 넘어갈 수 있을 것 같다.

필드 선언

필드 선언은 클래스의 중괄호 블록 내부 어디에서나 존재할 수 있다. 생성자 선언, 메소드 선언 앞뒤로 필드 선언 가능. 하지만 생성자와 메소드 중괄호 블록 내부에는 선언될 수 없다. (생성자와 메소드 중괄호 블록 내부에 선언된 것은 모두 로컬 변수가 된다. 변수 선언과 존나 비슷하기 때문에 겹치는 일을 방지하고자 이런 규칙이 생긴 것이 아닐까? 첨에 봤을 때 필드랑 변수랑 대체 뭐가 다른 건지 구분하지 못했음...)

String company = "현대자동차";
String model = "그랜저";
int maxSpeed = 300;
int productionYear;
int currentSpeed;
boolean engineStart;
  • 타입은 필드에 저장할 데이터의 종류를 결정한다. (기본타입, 참조타입(배열, 클래스, 인터페이스) 모두 올 수 있음) 아놔 참조타입 공부해야하는데 ㅠ
  • 필드의 초기값은 선언 시에 줄 수도 있고, 생략할 수도 있다.
  • 초기값이 지정되지 않은 필드는 객체 생성 시 자동으로 기본 초기값으로 설정된다.null, false, 0 (디폴트 데이터)
  • 정수타입 필드는 0, 실수타입 필드는 0.0, boolean 필드는 false, 참조타입은 null (객체를 참조하고 있지 않은 상태)

필드 사용

필드를 사용한다는 것 - 필드값을 읽고, 변경하는 작업을 뜻한다.

  1. 클래스 내부에서 사용할 경우 > 필드 이름으로 읽고 변경하면 됨
// Person클래스 
void method() {
	// Car 객체 생성
    Car myCar = new Car();
    // 필드 사용
    myCar.speed = 60;
}

// Car 클래스
// 필드
int speed;

// 생성자
Car() {
	speed = 0; // 값 변경 
}
 // 메소드
 void method(...) {
 	speed = 10; // 값 변경 
 }
  • Car 클래스의 speed 필드는 생성자와 메소드에서 값 변경이 가능하다.
  • 외부 Person 클래스에서 Car 클래스 내부의 speed 필드값을 사용하려면 Car 객체를 생성해줘야 한다!
  • myCar 변수가 Car 객체를 '참조'하게 되면 도트(.) 연산자를 사용해서 speed에 접근, 불러올 수 있다!
  • 도트(.)연산자: 객체 접근 연산자! 객체가 가진 필드나 메소드를 사용할 때 사용함

그러니까! 객체를 생성한 순간, Person클래스가 Car클래스 내부의 speed 필드에 접근이 가능해지는 것이다!!!


  1. 클래스 외부에서 사용할 경우엔?!

    클래스로부터 객체를 생성한 뒤 필드를 사용해야 한다!

    : 필드는 객체에 소속된 데이터이기 때문에 객체가 존재해야 필드도 존재한다.
public class Car {
	// 필드
	String company = "현대자동차";
	String model = "그랜저";
	String color = "검정";
	int maxSpeed = 350;
	int speed;
}

public class CarExample {
	public static void main(String[] args) { 
    	// 객체 생성
		Car myCar = new Car(); 
		
        // 필드값 읽기
		System.out.println(myCar.company); // 현대자동차
		System.out.println(myCar.model); // 그랜저
		System.out.println(myCar.color); // 검정
		System.out.println(myCar.maxSpeed); // 350
		System.out.println(myCar.speed); // 0 (초기값) 
		
        // 필드값 변경
        myCar.speed = 60;
        System.out.println(myCar.speed); // 60 (값이 수정됨!) 
        }
}
  1. Car 클래스에서 필드 선언을 해줬음.
    CarExample 클래스에서 Car 클래스 내부의 필드에 접근하기 위해서 객체를 생성했다. 그 객체의 2. 변수명은 myCar...!
  2. myCar 변수가 도트 연산자를 사용해서 Car 클래스 내부의 필드에 접근이 가능하게 되었다.
public class CarExample {
	public static void main(String[] args) { 
		Car myCar = new Car();
        Car myCar2 = new Car();
        }
}

이것이... 같은 객체로 보이시나요? 아닙니다. 전혀 다른 객체입니다!! 주소가 아예 다름.
그리고 객체의 데이터는 필드에 저장된다고 했죠? 그러니까 객체를 생성했을 때 객체에 실제로 만들어진 것은(저장된 것은) '주소' 입니다. 데이터는 힙에 저장된다고 해요. 음. 맞는 설명인가? 필기는 이렇게 함. 뭔가 더 헷갈려짐.

일단 필드의 기본적인 내용은 여기까지.
처음 필드라는 개념을 접했을 때보단 나은 것 같다. 하... 생성자가 문제임. 화이팅화이팅.

profile
영차영차 😎

0개의 댓글