2024-12-11(수)

class Person
//필드 선언
 private String name;
 private int age;
 private String phoneNumber;
 private String email
 
 -> 필드는 객체의 상태나 속성을 나타낸다.
 일반적으로 데이터의 안정성을 위해 private으로 선언.
 private이라는 것은 같은 클래스내에서만 접근할 수 있는 접근제어자.
 그렇다면 다른 클래스에서 어떻게 Person의 객체에 접근할까?
 -Getter메서드<값을 얻는 용도>와 Setter<값을 변경하고 초기화하는 용도>메서드
그렇지만 데이터의 안정성을 극대화하기 위해 Setter메서드도 일반적으로 사용하지 않고
생성자의 매개변수로 데이터를 받아 값을 저장하는게 일반적이다.
그러나 생성자는 초기값만 세팅 할 뿐 그 이후에 수정할 때는 당연히 Setter메서드가 필요

또한, static을 붙이지도 않는다. static을 선언하면 클래스 변수로 모든 객체가 같은 메모리 공간을
참조하게 됨. 즉 private static String name이라 선언하면 Person의 1객체가 name을 "김진영"이라 설정하면,
2객체도 "김진영" 이라는 이름 값을 가지게 되며, 2객체에서 name을 "김진수"라 바꾸어도
1객체의 이름도 "김진수"로 바뀌게 되는 것이다. 

따라서, 일반적으로 필드값은 각 객체마다 가지는 고유의 값이므로 
static을 붙이지 않는 인스턴스 변수로 선언해야한다.
그러나 경우에 해당 클래스의 모든 객체가 공통된 특성을 공유한다면 static을 붙일 수도 있겠다.
예를 들어, Korean People이라는 클래스의 객체를 만든다면 private static String nation이라고 
필드를 선언해도 모든 객체의 nation은 Korea니까 이때는 static 선언. 즉, 클래스변수로 선언하는 것이 적절하겠다. 
 
 //생성자 선언
 public Person(String name, int age, String phoneNumber, String email){
 this.name = name;
 this.age = age;
 this.phoneNumber = phoneNumber;
 this. email = email;
 
 ->생성자는 일종의 메서드로 객체를 호출할 때? 생성하는 용도의 메서드라고 생각하면 된다.
 객체를 생성하기 위한 용도로만의 메서드이기 때문에 리턴타입이 없고 그렇다고 void를 쓰지도 않는다.
 생성자를 선언하지 않아도 자바에서는 다음과 같은 매개변수 값을 가지지 않는 기본생성자가 내장되어있다.
 public person(){} 
 따라서 클래스를 만들기만 한다면, 해당 클래스의 객체를 new연산자를 통해 생성할 수 있다.
 하지만 데이터의 안정성을 위해 생성자를 재정의하여 매개변수로 객체의 데이터값을 받는다.
 그리고 생성자를 재정의 한다면 기본생성자가 사라진다. 따라서 필요한 경우에는 기본생성자를 명시적으로
 작성한다. 이때 기본 생성자와 다르게 매개변수를 가지지 않으므로 오버로딩이 되는 것이다.
 메서드 오버로딩처럼.
 
 (오버로딩: 같은 이름을 가진 메서드는 또 만들 수 없다. 그러나 매개변수의 타입이나 개수가 다르면
 메서드의 이름이 같더라도 메서드를 추가할 수 있다. 이것이 오버로딩)
 ex.StringBuilder의 append()메서드에 매개변수에는 객체가 들어갈 수 도 있고, int타입,String타입,
 double타입 등 다양한 타입이 들어갈 수 있는데 이는 여러가지로 오버로딩 되어있기 때문
 
 
 
 //메서드 선언
 public String whoIs(){
				String result = "이름: " + this.name + "나이: " + this.age;
				return result;
 }
 
 ->이름과 나이를 조회하는 메서드를 만들어보았다.
 제일 앞에 접근 제어자 public을 붙였다. 일반적으로 메서드도 다른 패키지에서 사용할 수 있게 
 public을 붙인다. 접근제어자는 public-protected-default-private 이렇게 있다.(아래 참고)
 접근 제어자를 붙이지 않는다면, 기본적으로 default로 설정이 되고 default는 다른 패키지에서
 접근이 불가하다. 그런다음 리턴타입을 명시한다.
 리턴타입이 없다면 void라 명시한다.
 
 ->this.는 객체를 의미한다. 즉 여기서는 해당 메서드를 호출하는 객체의 name과 age가 조회되는 것이다.
 또한 여기 메서드는 static이 붙어있지 않은 인스턴스메서드다. static이 붙으면 클래스 메서드!
static이 붙어있지 않은 인스턴스메서드는 메서드를 호출할 때 객체를 통해 호출한다.
(ex. StringBuilder sb = new StringBuilder();
     sb.appnd();-->이때 append()라는 메서드가 sb(객체). 를통해 호출했다)
 
static이 명시된 클래스 수준의 메서드는 아래 예시와 같다.
(ex. Arrays.sort()-> 배열을 정렬하는 메서드인데 한 배열 객체를 통해 호출하는 것이 아닌 
Arrays라는 배열 클래스를 통해 메서드를 호출한다.
생각해보면 간단한게 클래스 메서드는 객체가 무엇이든지 영향을 주지 않는 것이다.
그러나 객체에 따라서 결과값이 달라질 수 있는 메서드는 당연히 인스턴스메서드로 선언되는 것이다)

static으로 선언된 메서드라면 클래스명까지 붙여서 메서드를 호출해야하나 
같은 클래스 내에서라면 클래스명.을 붙이지 않고 바로 메서드를 사용할 수 있다.

image.png