JAVA/JAVA 수업

[JAVA] 21.06.03

샛별KIM 2021. 6. 3. 16:19

//객체지향
/* 
 * 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 : 외부에서 접근 불가능, 같은 클래스 내에서만 접근 가능
 *