[JAVA] 21.06.03
//객체지향
/*
* OOP특징
* 캡슐화 = 보안 = 보호 가능
* 관련된 데이터(필드)와 기능(메소드)가 하나의 묶음으로 관리
*
* 상속
* 이미 작성된 클래스(부모)를 이어받아서 새롭게 만드는 것
* 자식 클래스는 부모 클래스의 모든 속성(필드)과 동작(메소드)를
* 사용할 수 있습니다.
* 필요한 기능은 자식 클래스에서 추가해서 사용합니다.
*
* 추상화
* 불필요한 것을 제외하고 필요한 것만 유지합니다.
* 실제 객체를 인스턴스화 할 때 필요한 내용만 남기고
* 나머지는 제외하는 것 입니다.
*
* 다형성
* 객체의 동작이 변경되는 것
* 파라미터 상황에 따라 동작이 변경되는 것
*
* 자바 기초 ---- for if, array, oop(static, 상속, 추상화, 다형성, 인터페이스)
* 자바 중급 ---- 랩퍼클래스, 익셉션, 입출력
* 자바 고급 ---- net, 스레드
*/
run▼ configurations -> Arguments에서 옵션 설정 가능하다
//static
/*
* static은 정적이라는 의미를 가지고 있습니다.
* 자바에서는 정적 개념과 동적 개념을 구분하고 있습니다.
* 쉽게 표현하면 정적은 클래스가 로드되는 시점을 이야기하고
* 동적은 로드된 클래스가 실행된 이후를 말합니다.
*
* 이 중 객체는 동적 데이터라고 해서 프로그램이
* 실행된 이후에 발생되는 대표적 형태입니다.
* =========================================================
*
* 정적 멤버, 클래스 멤버 -> 객체를 통하지 않고 사용할 수 있는 멤버
* (ex. OOP01 oop01 = new OOP01();같은 객체생성 X)
* 모든 객체를 통틀어서 하나만 생성되고 모든 객체가 공유(!!)합니다.
*
* 인스턴스 멤버 : 인스턴스 생성 시 가지는 자신의 변수
* 두 개의 고양이 객체의 각각의 이름, 나이 등은
* 각각의 인스턴스 변수 이다!! 객체가 생성되면
* 인스턴스 변수 생성!!
* 별도의 기억 공간을 가지고 객체마다 각각 다른 값을 가집니다.
* 객체명.변수명
*
*
* 정적 멤버 : 같은 클래스에서 나온 모든 객체가 공통적으로 사용하는 변수
* 클래스.변수명
* 인스턴스를 생성하지 않고 사용합니다.
* 하나의 클래스에 생성은 한번만 됩니다!!
* 객체보다 클래스에 의지합니다.(클래스와 연결)
* static을 붙이면 됩니다.
* 정적 멤버처럼 정적 메소드도 만들 수 있습니다. = static 붙이면 됩니다!
* main 메소드에 static 붙은 이유? 객체 생성 없이 메인을 호출하기 위해!!!
*
* 사용 시 주의사항!!
* 객체가 생성되지 않은 상태에서 호출되는 메소드 이므로
* 객체 안에서만 존재하는 인스턴스 변수들을 사용할 수 없습니다.
* 정적 변수와 지역변수만 사용 가능합니다.
* 정적 메소드에서 인스턴스 메소드를 호출하면 에러가 납니다.
* (인스턴스 메소드로 객체가 생성되어야 사용할 수 있어서 입니다)
* 정적 메소드에서 정적 메소드를 호출하는 것은 가능합니다.
* 정적 메소드는 this 를 키워드로 사용할 수 없습니다.
* : this가 참조할 인스턴스가 없기 때분입니다.
*
* ex) final을 붙인 상수는 모두 다 같이 쓰는 변수입니다.
* 객체를 만들지 않고 쓰면 좋습니다.
* 그래서 static을 붙여주면 좋습니다!
*
*/
this(model, color); //생성자 호출
System.out.println("Car(2개짜리)를 호출합니다.");
/* 같은 클래스에서 정의된 다른 생성자를 호출하는 키워드
* this(type, type...)
* 호출하려는 생성자의 파라미터의 순서에 맞게 호출하면 됩니다.
* 단, this생성자 호출은 생성자 첫 머리에서만 호출 가능합니다.
* 딱 한번만 불러올 수 있습니다.
*/
/*
* 생성자(메소드) 오버로딩
* 같은 이름의 메소드 또는 생성자를 정의할 때 같은지의 판별 요소로
* 적용되는 기준을 메소드 또는 생성자 시그니쳐 라고 합니다.
* 이 시그니쳐는 파라미터의 갯수, 순서, 타입이 모두 같을 때만
* 같은 생성자 또는 메소드로 인식을 하고
* 하나라도 다르면 다른 메소드나 생성자로 컴파일러가 인식합니다.
* 하여 호술시 호출하는 파라미터의 시그니쳐를 보고
* 해당 생성자 또는 메소드를 공적으로 호출하도록 정의되어 있습니다.
* 이렇게 같은 이름의 생성자, 메소드를 시그니쳐만 다르게
* 정의하여 호출하는 것을 오버로딩 이라고 합니다.
*/
//생성자
/*
* 객체를 생성할 때 사용하는 메소드()
*
* 클래스가 객체화 되어질 때 실제 객체를 생성해주는 코드
*
* 생성자는 이외에도 아래와 같은 기능을 가지고 있습니다.
* 1. 클래스의 객체 생성
* 2. 멤버 필드 초기화
* 3. 필요에 따라서 초기화 메소드 실행
*
* 다시 정리 : 생성자 없이는 객체를 만들 수 없습니다.
*
* 생성자의 형식
* 생성자는 메소드와 유사한 형식을 가지고 있습니다.
* 하지만 메소드와는 기능적인 부분에서 차이가 있습니다.
*
* 1. 생성자의 이름은 반드시 클래스 이름과 같아야 합니다.
* 2. 메소드가 아니기 때문에 리턴 타입을 선언할 수 없습니다.
*
*
* 기본 생성자(Default Constructor)
* 자바에서는 모든 클래스마다 컴파일 시에 기본 생성자를 자동으로 넣어줍니다.
*
* 단, 클래스에 생성자가 하나라도 있다면 기본 생성자는 제공되지 않습니다.
*
* 기본 생성자는 파라미터가 없는 생성자를 말하고
* 이를 이용해서 생성된 객체를 기본 객체라고 합니다.
* 또한 모든 필드 값은 기본 값으로 초기화 됩니다.
*
*/
get set 자동생성!
Source -> generate Getters and Setters...
/*
* 접근 제어자
* 자바에서는 접근 제어자를 통해서 각 API의 접근 권한을 제한할 수 있습니다.
*
* 아래는 접근 제어자의 접근 범위를 나타낸 것입니다.
* public > protected > default(package) > private
*
* public : 가장 넓은 범위로 패키지 제한 없이 모두 접근 가능한 상태
*
* protected : 같은 패키지 내에서 접근 가능,
* 다른 패키지에서는 상속이나 자식클래스, 인터페이스라면 접근 가능
*
* default : 아무런 접근 제한을 두지 않을 때 = 비어있다면
* 같은 패키지 내에서 접근 가능
* 외부 패키지에서는 접근 불가.
*
* private : 자기 자신 클래스에서만 접근 가능, 그 외 모두 막음!
*
* 주의 : 클래스 앞에 붙는 접근제어자는 public, default만 있다!!
*
* 번외 : 클래스를 만들 때 어떤 클래스에 public을 붙여야 함?
* 왜 파일 이름과 public 클래스 명을 맞춰야 할까?
* 가독성? 자바 파일 안에 많은 클래스를 정의할 때
* 하나의 대표 클래스를 지정하고 파일명과 동일하게
* 맞추는 것이 가독성에 도움이 됩니다.
*
* 사람이 소스 코드를 읽을 때 public 키워드가 붙은 클래스를 본다면
* 현 소스가 어떤 자바 파일 이름으로 되어있는지 알 수 있습니다.
* = public이 없는 것은 자바 파일명과 동일한 class가 아니다.
*/
* public : 모든 접근을 허용. 어떤 클래스가 접근하든 다 open
* protected : 상속 받은 클래스, 또는 같은 패키지 내에서만 접근 가능
* default : 기본 제어자, 아무것도 붙지 않은 것.
* 클래스가 같은 패키지 내에 있어야 접근 가능
* private : 외부에서 접근 불가능, 같은 클래스 내에서만 접근 가능
*