개발기술/Java

Java 코딩구현기본 - 클래스,다형성,객체지향

bsh6226 2024. 4. 20. 20:39

PSVM (String[] args)로 알아보는 메소드

`main` 메서드라 한다.다. 자바는 `main(String[] args)` 메서드를 찾아서 프로그램을 시작한다. 

  • public:  when your program starts, the Java Virtual Machine (JVM) needs to invoke this method from outside the class that defines it.
  • static: The main method is static because it needs to be invoked by the JVM without creating an instance of the class.
  •  main: This is the name of the method that the JVM looks for as the starting point of the program.
  • String[] args :  this is Command-Line Arguments argss unlike runtime input such as scanner input.  theses are specified before the program starts and are used to configure or provide initial data to the program. IDEs like IntelliJ or Eclipse, you can specify these arguments in the run configurations.it is convention for JVM to recognize entry point.
    • Configuration: Passing configuration settings, like choosing a specific operation mode or setting initial values.
    • File Handling: Specifying file paths that the program needs to read from or write to.
    • Database Connection Details: Inputting credentials and other parameters required for database connections.x
  • void : 반환 타입(Return Type)으로 메서드가 실행 된 후 반환하는 데이터의 타입을 지정한다메서드가 값을 반환하지 않 는 경우없다는 뜻의 `void를 사용해야 한다.
  •  String[] args :  매개변수(Parameter). 입력 값으로메서드 내부에서 사용할 수 있는 변수이다매개변수는 옵션이다입력값이 필요 없는 메서드는 매개변수를 지정하지 않아도 된다.  

패키지

  • 패키지에 들어가는 자바 파일 첫줄에 `package variable;`와 같이 소속된 패키지를 선언해주어야 한다.
    • 클래스에 접근할 때 해당 클래스가 위치하고 있는 패키지명을 최상단에 'package name'과 같이 항상 적어줘야함.
    • 다른 패키지에 있는 클래스를 불러오려면 'pack.subpack.Classname' 과 같이 명시하여 호출해야함.
    • `import를 사용하면 다른 패키지에 있는 클래스를 가져와서 사용할 수 있다. 특정 패키지에 포함된 모든 클래스를 포함해서 사용하고 싶으면 `import시점에 `*()을 사용하면 된다. (import pack.a.*;)
    • 같은 이름의 클래스가 있다면 `import는 둘중 하나만 선택할 수 있다.
    •  패키지규칙
      • 패키지 이름은 모두 소문자를 사용한다. (관례)
      • 패키지의 이름과 위치는 폴더(디렉토리위치와 같아야 한다. (필수)
      • 패키지 이름의 앞 부분에는 일반적으로 회사의 도메인 이름을 거꾸로 사용한다, 클래스의 이름이 같아도 패키지명의 충돌을 방지하기 위함이다.
      • 계층 구조상 `a패키지 하위에 `a.b패키지와 `a.c패키지가 있더라도 컴퓨터 구조상 3가지는 각각 별개의 패키지이며 a패키지에서 a.b 패키지를 쓰려면 import 과정이 필요하다.

접근 제어자

  • 자바의 접근 제어자를 사용하면 해당 클래스 외부에서 특정 필드나 메서드에 접근하는 것을 허용하거나 제한할 수 있다. 
    • private 모든 외부 호출을 막는다.
    • default (package-private) : 같은 패키지안에서 호출은 허용한다. 어떤 표기도 없을 시 default값이 적용된다.
    • protected 같은 패키지안에서 호출은 허용한다패키지가 달라도 상속 관계의 호출은 허용한다.
    • public 모든 외부 호출을 허용한다.
    • 클래스 레벨의 접근 제어자는 `public`default만 사용할 수 있다. `private`protected는 사용할 수 없다.
  • 접근제어자 중요성 : 데이터의 안전성을 위한 캡슐화의 목적은 모듈 내의 데이터는 모듈의 메서드를 통해서 변경해야 한다는 것이다. 이를 위해서, 속성과 데이터를 어디까지 공개하고 숨길 것인지 결정하는 것이 핵심이다.
    •  캡슐화 :캡슐화는 쉽게 이야기해서 속성과 기능을 하나로 묶고외부에 꼭 필요한 기능만 노출하고 나머지는 모두 내부로 숨기는 것이다. 1.데이터를 숨겨라 2. 사용자에게 꼭 필요한 기능 외 부가적인 기능은 숨겨라 
    • 만약 내부적으로만 사용할 기능을  public으로 표시하고 따로 숨기지 않는다면, 해당 모듈을 import하여 개발에 활용하는 개발자에게 모듈을 이해하는데 혼동을 줄 수 있음.public으로 표기되어있는데 실제로는 내부적으로만 사용될 경우, 외부 개발자가 이 기능을 사용할 곳이 마땅치 않으면 코드해석에 혼선이 발생가능하며 좋지 않은 코드작성법이다.
    • Getter and Setter
      • setter method: public void setAge(int age) { if (age > 0) { // Basic validation this.age = age; } else {
      • getter method : public int getAge() { return age;}

클래스 키워드

  • public/private/protected/abstract / final / static / extend / implement

메서드

  • 메서드 : 자바에서는 함수를 메서드(Method)라 한다.
  • 메서드 선언(Method Declaration)  : public (접근제어자) / static (호출방식) / int (반환타입)/ add(메소드명) (int a, int b/ 매개변수)
    • static 객체를 생성하지 않고 호출할 수 있는 메서드. 해당 키워드를 생략하면 메소드는 클래스에 속하는 것이 아니라 instance에 속하게된다.
    • 매개변수(Parameter) : 메서드를 정의할 때 선언한 변수인 `String str`int age를 매개변수 다른말로 파라미터라 한다. 어원 그대로 메서드를 매개하는 변수이다. 메서드를 호출 할 때 인수를 넘기면그 인수가 매개변수에 대입된다
    • 반환 타입(Return Type) 메서드가 실행 된 후 반환하는 데이터의 타입을 지정한다. 메서드는 어떠한 값이든 return을 해야하며, 만약,  메서드가 값을 return 반환하지 않 는 경우없다는 뜻의 `void를 사용해야 한다`void print(String str)`
  •  메서드 호출과 값 전달1
    • 자바는 항상 변수의 값을 복사해서 대입한다이 대원칙은 반드시 이해해야 한다메서드를 호출할 때 매개변수에 값을 전달하는 것도 결국 변수에 값을 대입하는 것이다따라서 앞서 배운 자동 형변환이나 명시적 형변환이 그대로 적용된다. 
  • Method Extract 리팩터링 ; 특히 참조형 데이터 타입은 객체의 주소값이 전달되어 객체를 변경할 수 있으므로 유용.
    • It involves identifying a block of code within a larger method that can be isolated into a separate method of its own. For enhancing clarity and focus / For mproved Readability: Shorter, well-named methods. For  Modularity: Smaller, focused methods can be combined in new ways. For  Easier Debugging and Testing
    • Note : in Java, references to objects are created within a specific scope and are only valid within that scope, whereas the objects themselves, created on the heap, have lifetimes that extend beyond the scope of their references, persisting as long as there are active references to them from anywhere in the application.
  •   메서드 오버로딩 : 자바는 메서드의 이름 뿐만 아니라 매개변수 정보를 함께 사용해서 메서드 시그니처로 인지하고, 매서드를 구분한다따라서 다음과 같이 이름이 같고매개변수가 다른 메서드를 정의할 수 있다. 참고로 반환 타입이 다른 것은 인정하지 않는 다.
  • new ClassName().method() : creating a new instance of a class and immediately calling its methods.

클래스의 개념

  • 클래스가 필요한 이유
    • 제시상황 : 각 학생들의 이름과 관련정보들을 저장하고 유지보수해야함
      • 접근1 - 학생과 관련 정보를 각각 변수를 사용하여 저장 : 학생이 늘어날 때 마다 변수를 추가로 선언필요 
      • 접근2 - 배열을 사용하고 인덱스를 기준으로 학생들을 구분함 : 인덱스 번호로 데이터들을 관리하기 때문에 개발자가 혼동발생가능 
      • 접근3 - 클래스를 도입하여 개별 학생과 학생의 관련정보를 적절히 명명하고 하나의 묶음으로 관리함
        • 클래스 개념
          • 클래스를 키워드를 사용하면 `int`String과 같은 데이터 타입을 사용자가 직접 정의하여 생성할 수 있다 ('public class Student{}').
          • 이 클래스라는 설계도를 사용해서 실제 메모리에 인스턴스라는 객체를 생성할 수 있다. (Student student1 = new Student()) ; 여기서 ()는 생성자를 호출하는 기호이다.
          • 래스는 내부에 변수를 가진다클래스에 정의한 변수들을 멤버 변수또는 필드**라 한다.
            • 필드 값은 사용자의 초기화가 없어도 자동으로 값 초기화 된다 - numeric value : 0, boolean value : false, object value : null, char : null
          • 객체의 주소 :  `new키워드를 통해 객체가 생성되고 나면 참조값을 반환한다. 클래스 타입변수는 이 객체의 주소를 저장.
            • **주의!** 변수에는 인스턴스 자체가 들어있는 것이 아니다인스턴스의 위치를 가리키는 참조값이 들어있을 뿐이다따라서 대입 `=)시에 인스턴스가 복사되는 것이 아니라 참조값만 복사된다.
            • 클래스를 통해 생성한 객체의 메소드나 필드를 사용하려면 먼저 메모리에 존재하는 객체에 접근해야 한다. 객체에 접근하려면 `.` (, dot)을 사용하면 된다.
            • students[i].name`students[i].age처럼 `students[i]를 자주 접근하는 것이 번거롭다면 반복해서 사용 하는 객체를 `Students s와 같은 변수를 선언하고 참조값을 복사하여 담아두고 사용해도 된다.
            • instance의 경우 heap 메모리에 저장되며, instance의 reference는 stack에 저장되어 scope가 완료될 시 사라진다.

 

 

특수클래스 : ENUM

  • Enum :  열거형은 서로 연관된 상수들의 집합을 만들기 위한 클래스며 각 상수들은 클래스의 instance로 구현된다.
    • enum is Constant: Enum constants are implicitly public, static, and final. This means it cannot be changed. 
    • enum is Instance: Each enum constant is an instance of the enum class.
    • 도입배경 : 특정한 개체에 해당하는 상수값을 literal이 아닌 독특한 개체로 관리를 하고 싶음. literal로 관리할 시에 해당 값이 다른 개체상수와 겹칠 가능성이 있음. 이를 방지하기 위해 상수값을 litera;로 부여하는 것이아니라, 특정개체를 클래스의 public static final 인스턴스로 정의하는 practice가 정착되었고 enum은 이를 편리하게 도와준다.
    • Enum class의 상수들은 객체화하고 싶은 개체이며  개체들은 자동적으로 클래스의 인스턴스로 선언된다. 각 인스턴스들은 클래스의 필드를 저장할 수 있으며, 인스턴스 괄호() 안에 입력한 데이터가, 필드로 저장된다.
      • 과거 : class Fruit {public static final Fruit APPLE = new Fruit();} (static이기때문에 instance 생성과 관련없음)
      • Enum 사용 : Enum Fruit {APPLE}
    • enum은 맴버 전체를 열거 할 수 있는 기능도 제공한다. ; for (enum type f : instance.values())
    • 그 외에는 일반 클래스와 다르지 않기때문에 멤버변수 혹은 메소드 선언도 가능하다.
      • Enum class의 멤버변수는 각 enum instances들에 연계되는 데이터로, enuminstance(data1,data2)와 같이 표기한다.
public enum Planet {
    MERCURY(3.303e+23, 2.4397e6),
    VENUS(4.869e+24, 6.0518e6),
    private final double mass;   // in kilograms
    private final double radius; // in meters

 

 

 

 

    • 변수의 초기화
      • 멤버 변수: 자동 초기화 ; 숫자( `int` )= `0` , `boolean` = `false` , 참조형 = `null` 개발자가 초기값을 직접 지정할 수 있다
      • 지역 변수: 수동 초기화 ; 지역 변수는 항상 직접 초기화해야 한다.
      • null : 참조형 변수에서 아직 가리키는 대상이 없다면 `null이라는 특별한 값을 넣어둘 수 있다
      •  GC(가비지 컬렉션)  : : 아무도 참조하지 않는 인스턴스가 있으면 JVM의 GC(가비지 컬렉션)가 더 이 사용하지 않는 인스턴스라판단하고 해당 인스턴스를 자동으로 메모리에서 제거해준다
      • `NullPointerException : 객체를 참조할 때는 `.(dot)을 사용한다그런데 참조값이 `null이라면 값이 없다는 뜻이므로찾아갈 수 있는 객체(인스턴스)가 없다`NullPointerException은 이처럼 `null에 `.(dot)을 찍었을 때 발생한다.
      • 절차 지향 프로그래밍
        • 절차 지향 프로그래밍은 프로그램의 흐름을 순차적으로 따르며 처리하는 방식이다

          절차지향 프로그래밍의 한계는 바로 데이터와 기능이 분리되어 있다는 점이다. 데이터와 데이터의 기능이 분리되어 있으면 유지보수 관점에서도 관리 포인트가 2곳으로 늘어난다.

        • 코드최적화
          • 1. 클래스로 연관 데이터 묶음
            • 코드가 복잡해져서 다양한 변수들이 추가되더라도 음악 플레이어와 관련된 변수들은 `MusicPlayerData data` 객체에 속해있으므로 쉽게 구분할 수 있다
          • 2. 메서드 묶음(모듈화)
            • 로직 중복이 제거되었다. 같은 로직이 필요하면 해당 메서드를 여러번 호출하면 된다.
            • 변경 영향 범위:** 기능을 수정할 때 해당 메서드 내부만 변경하면 된다.
            • 메서드 이름 추가:** 메서드 이름을 통해 코드를 더 쉽게 이해할 수 있다.

 

 객체지향 프로그래밍 

  • 실제 세계의 사물이나 사건을 객체로 보고이러한 객체들 간의 상호작용을 중심으로 프로그래밍하는 방식이다, "무엇을중심으로 프로그래밍 한다. 절차 지향은 데이터와 해당 데이터에 대한 처리 방식이 분리되어 있다반면 객체 지향에서는 데이터와 그 데이터 에 대한 행동(메서드)이 하나의 '객체안에 함께 포함되어 있다. 이를 캡슐화라고한다.
    • 의미 : 객체지향적인 프로그래밍에서는프로그램의 실행 순서 보다는 음악 플레이어 클래스를 만드는 것 자체에 집중해야 한다. 음악 플레이어 가 어떤 속성(데이터)을 가지고 어떤 기능(메서드)을 제공하는지 이 부분에 초점을 맞추어야 한다.이것을 어떻게 사용할지는 분리해서 생각하자. 쉽게 이 야기해서 음악 플레이어를 만들어서 제공하는 개발자와 음악 플레이어를 사용하는 개발자가 분리되어 있다.  
    •  

생성자    

  • 객체를 생성하고 이후에 바로 초기값을 할당해야 하는 경우가 많다. 대부분의 객체 지향 언어는 생성자라는 기능을 제공한다. 생성자의 이름은 클래스 이름과 같아야  반환 타입이 없다.
  • 생성자 코드예시 : 그 외에는 메소드 생성과 같다 ;  public class MemberConstruct{ MemberConstruct(String name, int age, int grade){code for initialization}}·                
  • 생성자 사용장점 : 1. 중복호출제거 2. 기본값 설정필수화 기본 생성자
  • 기본생성자 : 매개변수가 없는 생성자를 기본 생성자라 한다클래스에 생성자가 하나도 없으면 자바 컴파일러는 매개변수가 없고작동하는 코드가 없는 기본 생성자를 자동으로 만들어준다.
  • 생성자 오버로딩 : 메서드 오버로딩처럼, parameter의 차이를 둔 똑같은 생성자를 만들면, 생성자 오버로딩이 가능하다.
  • 생성자 사용방지 : 생성자를 private으로 설정하면 해당 클래스의 인스턴스 생성을 막을 수 있다.
    • builder deisgn pattern : 빌더패턴은 Handling Complex Constructors를 위해서 쓰인다
      • 사용이유 : If a class has many constructor parameters, especially if many of them are optional, using a constructor directly can lead to clumsy and confusingoptional property setting.
        • 안티패턴 : Overloading Constructors: Create multiple constructors with different parameters for optional This can quickly become unmanageable with many optional fields.
      • 사용예 : new User.Builder("John", "Doe", "john.doe@example.com") .phoneNumber("1234567890") .age(30) .build();
        • 빌더라는 innerclass를 활용해서 필수적인 field를 먼저 값을 부여하고, 부가적인 field값은 순차적으로 별도로 부여하도록 하는 방식
    •  this :  Object instance 내에서 Object instance 자기자신을 지칭할 때 사용한다. The this keyword in Java is specifically designed to refer to the current object, or instance, of a class. 그래서 static method 내에서는 사용불가하다.
      • 메서드 내에서 기본적으로 멤버변수를 지칭할때도 this.멤버변수로 지칭이 필요하지만 자바프로그램에서 this는 기본생략된다 과거에는 `this`를 생략하지 않는 코딩 스타일도 있었다. 
      • 활용1 : 클래스의 필드를 클래스 내 메소드에서 변경하고자할 때, 만약, 파라미터와 필드명이 같을때, this.필드명을 통해서 변수가 파라미터에서 온것인지 필드에서 온것인지 구분을 위해서 사용한다. 기본적으로, 코드블럭의 안쪽일수록 변수 call의 우선순위가 있기에 메소드의 매개변수가 우선순위를 가진다. 
        • initMember(String name,...)메서드 안에서 `name이라고 적으면 매개변수에 접근하게 된다. 멤버 변수에 접근하려면 앞에 `this.이라고 해주면 된다. 여기서 `this는 인스턴스 자신의 참조값을 가리킨다.·  
      • 활용2 :  this() - 생성자 오버로딩에서, 다른 생성자를 사용하고 싶으면 this(`parameter)의 형식으로 최초생성자를 변주하여 코드의 첫줄에만 사용할 수 있다. 식별은 메서드오버로딩과 같이 파라미터의 종류와 개수로 구분이 가능하다.

 

    • Static 변수(클래스 변수, 정적 변수)
      • 인스턴스에 사용되는 멤버 변수 값은 인스턴스끼리 서로 되지않고 변수를 서로 공유하려면 static 변수를 사용한다. static 변수는 JVM시작부터 Garbage Collection 영향이나 신규생성없이 유지 되기에 정적변수라고 한다.
      • 정적변수는 클래스에 소속되는 변수로서 메소드 영역 내의 스태틱 영역에 저장된다.정적 변수에 접근하려 클래스명 `.(dot) + 변수명으로 접근하면 된다
      • 메서드도 동일한 개념으로 static method가 존재하며 인스턴트 생성없이 클래스를 통해서 접근할 수 있다.
    •   final 변수
      • 변수에 `final`키워드가 붙으면 더는 값을 변경할 수 없다. 반면, 메서드에 final이 붙으면 오버라이등가 불가능하며 클래스에 final이 붙으면 상속이 불가능하다.
        • final을 필드에 사용할 경우 해당 필드는 생성자를 통해서 한번만 초기화 될 수 있다.
        •  매개변수에 `final` 이 붙으면 메서드 내부에서 매개변수의 값을 변경할 수 없다. 따라서 메서드 호출 시점에 사용 된 값이 끝까지 사용된다.
        • 자바에서 `static final` 을 사용해 정적이면서 고칠 수 없는 변수를 상수라 하고, 관례상 상수는 대문자에 언더스코 ( `_` )로 구분한다. 상수는 값을 바꿀수 없기 때문에 데이터이지만 public으로 접근허용하여 사용할 수 있도록 하는게 좋다.

상속  

  • 부모 클래스 (슈퍼 클래스)**: 상속을 통해 자신의 필드와 메서드를 다른 클래스에 제공하는 클래스

  • 자식 클래스 (서브 클래스)**부모 클래스로부터 필드와 메서드를 상속받는 클래스
  • public class ElectricCar(자식) extends(키워드) Car(부모)
  • 상속구조활용 : 위 부모인 `Car에 `openDoor()기능을 추가하면 된다. 이렇게 하면 `Car의 자식들은 해당 기능을 모두물려받게 된다. 
  • 기존 클래스의 필드와 메서드를 새로운 클래스에서 재사용하게 해 준다. 이름 그대로 기존 클래스의 속성과 기능을 그대로 물려받는 것이다. 상속을 사용하려면 `extends` 키워드를 사용 하면 된다. 그리고 `extends` **대상은 하나만 선택**할 수 있다.

 

    •  상속과 메소드 오버라이딩 :
      • 부모 타입의 기능을 자식에서는 다르게 재정의 하고 싶을 때 동일한 이름의 메서드를 자식 클래스에 생성한다.
      • **@Override : @이 붙은 부분을 애노테이션이라 한다애노테이션은 주석과 비슷한데프로그램이 읽을 수 있는 특별한 주석이라 생각하면 된다. 오버라이드를 작성하고 애노테이션을 붙인다. 애노테이션이 없어도 작동하지만, 컴파일러가 애노테이션을 구현하는 문법에 컴파일오류를 생성하여 컴파일러가 보조해준다.
      • 상속과 메모리구조
        • 상속 관계의 객체를 생성하면 그 내부에는 부모와 자식이 모두 생성된다.상속 관계의 객체를 호출할 때대상 타입을 정해야 한다.
        • 이때 호출자의 타입을 통해 대상 타입을 찾는다.현재 타입에서 기능을 찾지 못하면 상위 부모 타입으로 기능을 찾아서 실행한다.기능을 찾지 못하면 컴파일 오류 가 발생한다.
      • 부모(super)클래스 
        • child에서 특정 method를 접근할때, 자바는 본인 타입에 없으면 상속관계의 부모 타입에서 기능을 찾는데, 이때 접근 제어자가 영향을 준다. 왜냐하면 객체 내부에서는 자식과 부모가 구분되어 있기 때문이다. 결국 자식 타입에서 부모 타입의 기능을 호출할 때, 부모 입장에서 보면 외부에서 호출 한 것과 같다.
        • 부모와 자식의 필드명이 같거나 메서드가 오버라이딩 되어 있으면자식에서 부모의 필드나 메서드를 호출할 수 없다.
          • `super키워드를 사용하면 메소드나 필드값이 오버라이딩이 있음에도 불구하고 부모를 참조할 수 있다.`super` 는 이름 그대로 부모 클래스에 대한 참조를 나타낸다. 내부 클래스에서 부모 클래스에 접근할때 사용함.
          • ex) super.method() :본인타입 상위, this.method() : 본입타입
        • 상속 관계를 사용하면 자식 클래스의 생성자에서 부모 클래스의 생성자를 반드시 호출해야 한다.(규칙) 상속 관계에서 부모의 생성자를 호출할 때는 첫줄에`super()` 를 사용하면 된다. 단, 부모의 생성자가 따로 정의되어 있지 않아 기본 상속자를사용한다면 super()를 생략해도된다.
        • 상속 관계의 생성자 호출은 결과적으로 부모에서 자식 순서로 실행된다. 따라서 부모의 데이터를 먼저 초기화하고 그 다음에 자식의 데이터를 초기화한다
    •  
    •  

다형성 

  • 한 객체가 여러 타입의 객체로 취급될 수 있는 능력을 뜻한다. 다형성을 사용하기 위해서는 1. 다형적 참조 2. 메서드 오버라이딩을 활용해야한다.

    •  1. 다형성과 다형적참조 : 자바에서 부모 타입은 자신은 물론이고자신을 기준으로 모든 자식 타입을 참조할 수 있다이것이 바로 다양한 형태를 참조할 수 있다고 해서 다형적 참조라 한다.
      • 변수에 객체담기 : 부모 타입의 변수는 자식 타입의 객체를 담을 수 있다. 반대로 자식 타입의 변수는 부모 타입의 객체를 담을 수 없다.  자식타입의 객체에는 부모인스턴스가 존재하지만 반대로 부모타입의 객체에는 자식인스턴스가 존재하지 않기 때문이다.
      • 접근제약 : 상속 관계의 인스턴스 내에서 부모와 자식이 모두 존재한다고 가정하였을때, 참조변수가 부모타입이라면, 우선, 참조변수는 부모인스턴스를 pointing하고 자식 방향으로 찾아 내려갈 수없다. 이는 자식클래스에서는 extends를 통해서 parent로 참조가 되지만, parent에서는 어떤 자식이 자신을 참조하는지 알 수 없기 때문.
        • Parent poly = new Child()` 와 같이 부모 타입의 변수를 사용하게 되면 `poly.childMethod()` 와 같이 자식 타입에 있는 기능은 호출할 수 없다.
        • 이는, 다운캐스팅을 통해서 문제를 해결할 수 있다. 부모 타입을 자식 타입으로 변경하는 것을 다운캐스팅이라 한다. 반대로 부모 타입으로 변경하는 것은 업캐스팅이라 한다 
        • 다운캐스팅 : Child child = (Child) poly; child.childMethod(); 다운케스팅을하면 참조변수는 부모인스턴스가아니라 자식인스턴스를 우선 pointing하고 있어 method를 부를수 있다. 단, 변수가 참조하고 있는 객체가 자식instance를 포함하지 않는 경우가 있고 이때 오류가 발생하기에 다운캐스팅은 명시적 표현이 필요하다.
          • 부모변수instanceof자식클래스 : 다운캐스팅을 수행하기 전에는 먼저 `instanceof` 를 사용해서 변수값이 원하는 타입으로 변경이 가능한지 확 인한 다음에 다운캐스팅을 수행하는 것이 안전하다.

        • 업케스팅 :  Parent parent = new Child() 참고로 업캐스팅은 매우 자주 사용하기 때문에 생략이 가능하고 생략을 권장한다.
        • 일시적 다운 캐스팅 : ((Child) parent).childMethod 이 코드를 실행하면 `Parent` 타입을 임시로 `Child`로 변경한다

    • 2. 다형성과 오버라이딩 : 오버라이딩 된 메서드는 항상 우선권을 가진다.** 오버라이딩은 부모 타입에서 정의한 기능을 자식 타입에서 재정의하는 것이다. 더 하위 자식의 오버라이딩 된 메서드가 우선권을 가지는 것이다. 부모 인스턴스에서 자식 인스턴스로 내려갈 수 없음에도 오버라이딩은 예외적으로 적용된다.
      • parenttype = parentinstance인경우 parentmethod가 호출되지만 parenttype = childinstance인 경우, 오버라이딩된 childmethod가 호출된다. 오버라이딩이 되지 않았다면 참조가되고있는 부모인스턴스의 메소드가 호출될것이다
    • 3. 다형성의 활용 : 추상클래스와 인터페이스
      • 다형성은 각자의 인스턴스가 타입이 다르더라도 동일한 메서드를 사용하고 싶을때 upcasting기능을 통해서 메서드에 입력이 가동하도록 한다
      • 오버라이딩을 통해서 동일한 매서드에 input되고 메서드 호출이 되더라도 각자 오버라이딩한 메서드를 호출 할 수 있다. 자식메서드에서 오버라이딩을 진행할시 annotation @overriding을 사용하면 문법적으로 검증을 도와준다.
      • 추상클래스 : 자식들의 다형성을 위해서 생성되었지만 실제로 인스턴스로 사용하지 않는 클래스를 추상클래스라고 한다.   abstract class{}을 통해서 문법적으로 추상클래스로 제약시킬 수 있으며 abstract method(){}을 통해서 추상메서드로 제약시킬 수 있다. 이경우, 클래스의 인스턴스가 생성이되지않으며 자식들의 메소드는 반드시 오버라이딩을 해야한다.
      • 인터페이스 : 추상 메소드 외에는 메소드가 존재하지 않는 클래스를 순수추상클래스라고 하는데, 자바는 이러한 기능으로 Interface라 타입을 제공한다. 인터페이스는 implement를 통해서 다중상속을 지원하며 메소드 상에서 public, abstract을 생략할 수 있다. 단, 멤버변수는 상수로서 public static final의 기능을 포함한 채로 생성가능하다.
      • 인터페이스의 사용 : 인터페이스는 클래스의 코드를 작성하는 사람의 편의성이 아니라,input형식과 output형식의 제약을 부여함으로써 코드를 호출하는 사람이 제약을 인지하고, 호출 코드내에서 다른 클래스로 편하게 갈아끼울 수 있도록 한다.
    • List<String> stringList = new ArrayList<>(stringSet); creating with iterface rather than implementation. 
      • Flexibility: When you declare your reference variable as an interface (List in this case), you gain the flexibility to change the concrete implementation without affecting the rest of your code
      • API Consistency: Using the interface type in declarations, especially in API design, can lead to more consistent and easier-to-understand APIs.

Configuration 

  • 에너테이션 : 프로그램의 동작에 영향을 미치지 않으면서, 특정 프로그램에대한 유용한정보(metadata)를 제공하는 표기법. 주로 컴파일러, 프레임워크, 라이브러리에 해당 프로그램에 대한 정보를 제공하기위해서 사용한다. 
    • 에너테이션의 종류 
      • java 표준 annotation : 자바에서 공식적으로 설정한 annotaion
        • @override : 해당 메소드가 override하는 메소드 임을 알리고, override메소드로서 형식을 잘 지켰는지 컴파일러가 체크하도록 알려줌
        • @deprecated : 해당 메소드가 오래되어 더이상 사용되지 않는 메소드라는 것을 컴파일 단계에서 유저에게 알려줌.
    • 에너테이션 작동원리 
      • 애너테이션은 각종 인터페이스들을 상속한 java program이다. 인터페이스의 기능을 통해서 컴파일러와 직접적으로 정보를 주고받을 수있는, Annotations are part of the Java language: They are defined using @interface and can have elements.
  •  XML (eXtensible Markup Language) is read by programs using XML parsers. These parsers can process the XML data, allowing programs to extract and manipulate the data according to their needs
    • XML Schema Definition (XSD) is used to define the structure and data types for an XML document.