자바 클래스에 대해서 다시 정리할 필요성을 느꼈다.
도메인 분석을 통해 최소의 객체
단위로 분리하려면 그 객체 클래스마다 하는 기능을 정의해두고 지금까지 사용했던 Out-In
방식에서 In-Out
방식으로 고쳐나가보려고 다시 정리해본다.
우선 부족한 것이 자꾸 앞 클래스에서 get
메서드를 사용하는게 문제이지 않나 싶다.
get
을 통해 다른 곳에서 값을 변경하는 것은 좋지 않은 방법인 것 같다.
어떤 로직을 구현함에 있어서 웹에서 잘 짜여진 API로직을 가공하려면 웹이 중요한게 아니라 일단 순수 자바가 더 중요한 것 같다. 요즘 그래서 기본부터 천천히 다시 공부중이다.
호출로 뭔가를 바꿔줄 수 있는 일을 하자...
위 문구를 계속 생각하자 ❗
get메서드
로 뭔가를 바꾸려는 것을 되도록이면 지양해야 한다.get
메소드 그러니까 그 객체의 필드 변수를 그대로 반환하는 것을 말한다.Override
를 생각하면 된다.클래스는 개발자의 설계도면이라고 봐도 되겠다.
예를 들어보자
public class Car {
private String name;
...
}
이런 Car
클래스가 있다고 가정하면
실제 main 메소드에서
public static void main(String[] args) {
Car car1 = new Car();
Car car2 = new Car();
Car car3 = new Car();
}
똑같은 Car
클래스 3개 이지만 이들은 각기 다른 인스턴스
이다.
그러니까 클래스를 설계도면이라고 치면 도면대로 만드는 것은 여러개를 만들 수 있으니까 그래서 도면이라고 칭했다.
자바의 개발 단계는
1. 클래스를 설계한다.
2. 클래스를 가지고 객체를 생성
3. 객체를 사용한다
이렇게 3단계이다. 단순하다.
항상 1단계를 잘 설계하자고 머릿속에 생각을 해야만 좋은 코드가 나올 것이라고 생각한다.
그리고 new
는 객체를 실제 생성시키는 역할을 하기 때문에 Car()
는 생성자이고, 이 연산자로 생성된 객체는 힙 영역에 생성된다.
객체의 위치를 모르면 그 객체를 사용할 수 없기 때문에 스택에 넣지않고 힙에 적재해주는 것이다. 그래야 주소를 리턴해서 사용할 수 있으니까 말이다.
이제껏 그냥 넘어갔던 내용을 발견했다... 상당히 치명적이다. 기본 제대로 알고있지 않은것 같은..
필드에서는 선언시에
public class Car {
String company = "kia";
String model = "k3";
int maxSpeed;
int oil;
}
이런식으로 =
을 사용해서 직접 초기화를 해줘도 되지만
아래의 maxSpeed
나 oil
처럼 자동으로 기본값 초기화가 되는데
간과했던 사실
로컬 변수는 항상 내가 선언만 했을 경우에는 nullPointerException
이 발생했다.
public class Car {
String company;
...
public void move() {
int speed;
System.out.println(speed);
}
}
이렇게 할 경우 에러가 발생한다.
지역 변수는 사용하기 전에 반드시 초기화를 해야한다!
이것을 넘어갔던 것이다. 그래서 에러를 많이 띄웠었다.
인터페이스도 다시한번 정리하는 시간을 가져야겠다. 😅