//클래스 컨닝페이퍼
//클래스는 필드와 메소드로 이루어져 있다.
//필드란, 해당 클래스의 변수(=객체)가 어떤 데이터 타입의 정보를 어떤 이름으로 담을 수 있는지 적어주는 것이다.
//메소드란, 해당 클래스의 기능을 적어놓은 곳이다.
//필드는 우리가 변수를 '선언'하듯이 만들어 주게된다.
//예시: int id, String name, int age ....
//메소드는 이 기능이 무엇이 필요하고, 끝나면 무엇을 돌려줄지를 선언해주고 {}안에 어떤 기능인지 자세하게 적어주게 된다.
//예시: public static void main(String[]args){
// System.out.println("Hello,World!!!");
//}
//접근제한자(Access Modifier)
//접근제한자란 해당 필드 혹은 메소드가 외부에서 어디까지 호출이 가능한지를 정해주는 키워드이다.
//public, protected, default, private
//4단계가 있다.
//public: "공공의"-> 외부클래스에서 객체를 만들면 해당 외부 클래스의 위치가 어딘던간에
// 퍼블릭이 붙은 필드와 \\메소드를 호출\\ 할 수 있다.
//protected: "보호받는"-> 외부클래스 중에서 자기와 같은 패키지에 있거나 자기를 상속받는 클래스는
// protected가 붙은 필드와 메소드를 사용 할 수 있지만
// 다른패키지이고 상속도 안받는 외부클래스는 사용할 수 없다.
//default: "기본의"-> 우리가 아무것도 안붙여주면 자동으로 default 접근제한자가 적용된다. default의 경우에는 같은 패키지의
// 다른 클래스면 사용 가능하지만, 패키지가 달라지면 사용 할 수 없다.
//private: "사적인"-> 자기 자신만 내부에서 사용가능하고, 외부는 아예 사용이 불가능하다.
// 예전에는 access modifier를 그리 신경써서 적어주지 않았지만
// 이제는 좀 극단적으로 모든 필드, 그리고 외부에서 쓸 메소드가 아닌경우 무조건 private가 붙는다.
// 메소드 선언하기
// 메소드는
// 접근제한자 (static) 리턴타입 이름(파라미터)로 선언한다.
// static: 생략이 가능하지만, 만약 해당 메소드를 객체선언 없이 호출 할거면 꼭 붙여주어야 한다.
// 리턴타입: 해당 메소드가 종료되면서 어떤 데이터타입의 값을 호출된 곳으로 보내줄지 정해주어야 한다.
// 만약 해당 메소드가 아무런 값도 호출된 곳으로 보내주지 않는다면, void라고 적어주면 된다.
// 만약 리턴타입이 존재하는 경우에는 항상 메소드의 {}에 return이라는 명령어를 통해서
// 리턴 타입과 일치하는 데이터 타입의 값을 보내주어야 한다.
// void의 경우 리턴을 쓰면 에러가 난다. \\void는 리턴타입이없을때씀\\
// return명령어의 경우 메소드 어디에 적혀있던간에 return을 만나는 순간 !
// 메소드는 종료된다.
// 파라미터: 파라미터는 이 메소드가 실행하는데 필요한 \\외부의 값을 파라미터라고 한다.\\
// \\파라미터는 이름 뒤에 괄호 안에 들어가게 된다.\\
// 만약 해당 메소드가 아무런 외부의 값도 필요하지 않는다면, 안적어줘도 된다.
// 하지만, 파라미터는 하나의 변수처럼 취급되기 때문에, 해당 파라미터와 같은 이름의 변수는 만들어 줄 수 없다!
// 파라미터도 변수처럼 (데이터타입 이름)으로 적어주게 된다.
//필드 vs 파라미터
// 몇몇 메소드를 보면, 필드와 파라미터가 완전히 똑같이 생긴 경우가 있다.
// 예를 들어서 필드에 int age, 파라미터에 int age가 있는경우
// 해당 메소드 내부에선 age라고 하면 자동으로 파라미터 age가 지칭된다.
// 만약 해당 메소드 내부에서 필드를 사용해야 한다면? (예: 파라미터로 넘어온 age의 값을 필드 age에 넣어줄때)
// 근데
// age = age 라고 하면?
// 파라미터 age에 파라미터 age의 현재값을 넣으세요 -> 필드의 값은 변경 안되고 파라미터도 자기 자신의 값으로 초기화되는 코드가 된다.
// 따라서 왼쪽의 age는 파라미터가 아닌 필드의 age라는것을 명시해야 한다.
// 그럴 때는 :"this."이라고 붙여서 왼쪽의 age가 해당 메소드를 실행시키는 객체의 필드인것을 표시하면 된다.
//만약 우리가 객체를 처음 만들면, 어떤 값들이 들어갈까?
// 우리가 처음 객체를 만들면, 해당 객체에는 생성자라는 메소드가 정한 값들이 자동으로 들어간다.
// 하지만 우리가 생성자라는 메소드를 안 만들어줘도 우리는 그 메소드를 사용 할 수 있다.
// 왜냐? Java가 무보건 기본생성자를 제공해 주기 때문이다.
//생성자는 리턴타입도 없고 메소드의 이름도 클래스의 이름과 똑같다.
//예시: Car(), String()....
// 객체를 선언하고 초기화 할 때,
// Car c1 = new Car(); 라고 하면서 우리가 생성자를 호출해서
// Car의 객체 c1의 필드값을 기본값으로 초기화하게 된다.
//기본생성자의 경우
// 필드의 데이터타입에 맞춰서
//데이터타입이 참조형 데이터타입인 경우에는 null로 초기화하고
//기본형 데이터타입인 경우에는 0으로 초기화 한다.
//null 이란 무엇인가?
// 참조형 데이터타입들은 자기가 직접 값을 가지고 있는게 아니라
// 그 값을 가지고 있는 공간의 메모리 주소값을 가지고 있는다
// 근데 만약, 메모리 주소값은 존재하고 있지만 해당 공간이 그 클래스의 객체와 맞는
// 공간으로 초기화 되어있지 않은 상태라면?
// 실제 필드의 값이나 해당 클래스의 메소드는 적혀있지 않으므로, 잘못된 참조를 하게된다.
// 이렇게 해당 공간이 밑준비가 안되어있는 상태를 null이라고 하고
// 그리고 밑준비가 안되어있는 상태에서 해당 클래스의 메소드를 실행하려고 하거나 혹은
// 필드를 쓸려고 하면? 이것은 잘못된 참조, NullPointerException 이라는 문제가
// 발생하게 된다.
// 만약 여러분들이 필드와 관련하여 NullpointerException을 방지하려면?
// 여러분들이 직접 생성자를 만들어서, 해당 필드를 null이 아닌 다른걸로 초기화 해주는 것도 한가지 방법이 될 수 있다.
// 생성자는
// public 클래스이름() 으로 선언하고
// 만약 파라미터가 필요한 경우에는 파라미터도 적어준다.
// 하.지.만
// 파라미터가 있는 생성자를 만드는 순간...
// 더이상 파라미터가 없는 생성자는 사용 할 수 없다.
// 따라서 여러분들이 파라미터가 있는 생성자와, 파라미터가 없는 생성자 모두 필요하면
// 모두 다 만들어주어야 한다.
// 파라미터를 다루실 때 주의할 점
// 여러분들이 가장 흔히 실수하는게,
// 파라미터의 이름과 그리고 해당 메소드를 호출하는 외부클래스의 변수의 이름이 상관이 있다고 생각하시는게
// 가장 큰 실수가 된다.
// 우리가 파라미터 이름을 얼마나 정확하게 용도에 맞게 완벽한 영어를 써서 지어주더라도
// 자바는 신경 안쓴다.
// 자바가 신경쓰는건, 파라미터의 타입과 그리고 해당 메소드를 실행한 곳에서 보내준 데이터 타입이 일치한는지만
// 신경을 쓴다.
// 우리가 파라미터를 (String name, String address, String email)이렇게 정해주더라도
// 자바는 (String, String, String)만 보게된다.
// 파라미터에 이름을 붙이는 이유는, 해당 메소드가 기능구현을 할 때 해당 파라미터를 쉽게 부르기 위해서지,
// "아 name이니깐 정확히 String name만 외부에서 받아 올 수 있다"하는 개념이 아닌것이다.
// 즉, 우리는 그냥 String 3개만 파라미터로 주면 되는것이고
// 해당 메소드는 앞에서 차례대로 각각을 name, address, email이라고 부를 뿐이다.
// 오버로딩(overloading)
// 오버로딩이란?
// 같은 이름의 메소드이지만, 파라미터의 내용이 달라지면서
// 우리가 비슷한 기능을 하지만 파라미터의 내용에 따라서 다른 내용이 구현을 하게 만들어주는 것을
// 오버로딩이라고 한다.
// 예시: println()
// println()에 파라미터로 객체를 넣으면, 그 객체의 toString() 메소드의 결과값이 출력이 된다.
// 근데 우리가 toString()을 안만들면?
// 그러면 자바에서 기본적으로 제공해주는 toString()의 결과값이 나오게 된다.
// 하지만 자바가 우리가 만드는 클래스의 어떤 필드가 있고, 그 필드에 어떤 값이 있는지 알고 있을까?
// 그것은 당연히 예언이 되니까 절대 불가능 하다.
// 따라서 자바가 기본적으로 제공해주는 toString()은 해당 클래스의 패키지명.클래스이름@ 메모리주소값이 출력이
// 되도록 만들어 놨다.
// 이 toString 같이 자바에서 기본적으로 제공해주는 몇몇 메소드들이 있는데
// 그 메소드들은 java.lang.Object 안에 정의되어 있다.
// 그리고 이 java.lang.Object 는 모든 클래스의 부모클래스이기 때문에
// 우리는 해당하는 메소드들을 쓸 수 있는 것이다.
// 이렇게 한 클래스를 부모클래스로 지정해서 그 부모클래스의 메소드를 자식들이 별도의 구현없이 쓴느것을
// 상속이라고 한다.
// 하지만 toString 처럼 부모클래스에 정의되어있는 메소드가 자식 클래스가 쓰기 부적합해서
// 자식클래스가 재 정의 해주는 것을 오버라이딩(overriding)이라고 한다.
//오버라이딩을 할 때 주의해야 할 점
// 부모클래스에서 선언한 것과 일치하도록 자식 클래스에서 메소드를 선언해주어야 한다는 것이다.
// toString()의 경우, java.lang.Object 에서 public String toString()으로 선언
// 했으므로 우리도똑같이 적어주어야 한다.
// 또 주로 쓰이기 때문에 오버라이딩을 해야 할 메소드 중에 equals()도 있다.
// java.lang.Object 에선 우리가 만들 클래스가 무엇을 기준으로 비교해서 같은지 다른지 판단 하는것을 그 기준점을
// 알지 못한다.
// 그래서 java.lang.Object 안의 equals는 주소값 비교를 하게 만들어 놨다.
// String의 equals의 경우 스트링 클래스 내부에서equals()를 오버라이딩 해서
// 문자들이 전부 일치하면true, 같은 위치에서 글자가 다르면 false가 리턴되게 오버라이딩 한 것이다.
// 따라서 여러분들도 여러분들이 만드는 클래스에서 equals()를 실행해야 한다면, 직접 오버라이딩 해야한다.
// equals 메소드는 public boolean equals(Object o)로 선언되어있다.
//
public class Ex01Class {
}
'JAVA' 카테고리의 다른 글
lotto // Array (0) | 2020.04.23 |
---|---|
배열 (Array) (0) | 2020.04.23 |
Car // 상세 (0) | 2020.04.23 |
Car // 기본입력 (0) | 2020.04.23 |
(별찍기) 마름모 공백 별 (1) | 2020.04.23 |