
80년 초 소프트웨어의 위기(빠른 변화를 못쫓아감)에 의해 해결책으로 절차지향에서 객체지향 언어를 도입하였다.
OOP( Object Oriented Programming ) 는 프로그래밍 언어 + 객체지향개념(규칙) 으로,
남의 부품 ( code ) 를 편하게 가져다 사용하기 위한 것이라고 이해하면 쉽다.
남의 부품 ( code ) 를 가져다 쓸 때 어떻게 써야 편하게 쓸까??
: 분류 ( Classification ) 를 잘 해야 한다.
Classification ( 분류 체계 ) 의 약자.
다른 부품을 잘 사용하기 위해서는 분류가 필요하기 때문에 Class 와, Class 의 종류별 묶음인 Pakage 분류 체계가 존재한다.
Class 안에는 각종 메서드와 변수(필드) 등을 담기 때문에 class 의 이름은 이러한 변수와 메서드를 대변하는 이름이어야 한다.
Class 는 자료형이 될 수 있다. ( 참조형 타입으로 사용 OK )
하나의 파일에 한 개 이상의 클래스 ( 1개만 쓰는 것이 바람직하다 )
만약 여러 클래스를 한 파일 안에 써야 할 상황이면 그 중 public class 는 1개만 사용 가능하다.
파일명과 클래스명이 정확히 일치해야 한다.
1) 만약 public class 가 하나도 없으면 나머지 class 이름 들 중 어느 이름도 가능하다
2) 만약 public class 가 아니더라도 main 메서드를 가진 class 이름과 파일의 이름이 일치해야 한다.
앞글자는 대문자로 표시해야 한다. ( 파스칼 표기법 )
앞글자에 특수문자나 숫자는 금지한다.
JAVA 에서 사용되는 표기법 ( 혼용해서 사용 OK )
1.파스칼 표기법: 모든 단어에 첫 글자는 대문자이며 나머지는 소문자 ( Blackcolor )
2.카멜 표기법: 최초의 사용되는 단어 외에는 의미를 갖는 단어의 첫글자를 대문자로 ( blackColor )
Class 안에서 스스로 동작 및 실행이 가능한 메서드.
Class 안에 main 메서드가 없으면 그 Class는 스스로 동작 할 수 없다.
그래서 누군가가 그 Class 를 사용해주어야 한다.
( 이때 main 메서드가 있는 클래스는 Main 으로 지어주면 좋다. )
모든 것을 멤버라고 부른다멤버변수(필드) : 클래스 안의 변수 ( 필드 )를 칭한다.생성자 :복사본(객체)을 만들기 위해 가장 먼저 호출하는 메서드.new 생성자(); 로 객체 생성이 가능하다.Method : 변수가 어떤 사물의 속성을 의미하면 메서드는 사물의 기능을 의미한다.클래스의 필드(field)란 클래스에 포함된 변수(variable)를 의미한다.
인스턴스 변수 : 클래스 영역에서 선언한다. 객체가 생성됬을 때 생성된다.클래스 변수 : 클래스 영역에서 선언한다. 클래스가 메모리에 올라갈 때 생성된다. Static 키워드를 붙인다.지역 변수 : 메서드 영역에서 선언한다. 메서드 수행이 시작될 때부터 끝날 때까지 유효하다.매개 변수 : 메서드 영역에서 선언한다. 메서드 수행이 시작될 때부터 끝날 때까지 유효하다.클래스 변수와 인스턴스 변수는 초기화를 하지 않아도 변수의 타입에 맞게 자동으로 초기화 된다. (ex) int lv;
하지만 지역변수는 꼭 초기화해줘야 한다. (ex) int lv = 0;

객체마다 가져야 하는 개별 값을 유지하기 위해 사용한다. 그래서 속성의 개별 영역 에 주로 쓰인다.클래스 영역에서 선언한다.객체가 생성될 때 생성되어 Heap 영역에 저장 된다.
공통으로 사용하고 싶을 때 사용한다.클래스 영역 에서 선언한다.클래스가 메모리에 올라갈 때 생성 되어 정적 영역(Method 영역)에 저장 된다.
인스턴스 변수 : 객체 생성 후 참조변수 c 를 이용하여 인스턴스 변수를 불러온다.클래스 변수 : 객체 생성 필요 없이 Card 클래스를 이용하여 클래스 변수를 불러온다.클래스 변수도 참조변수 c 를 사용할 수는 있다. 하지만 이렇게 사용 시에는 객체를 통해 클래스에 접근하는 것이기 때문에 좋은 방식이 아니므로 사용 X
1. 같은 클래스 내에서 static 멤버끼리Inner.st_msg();가 아닌st_msg()와 같이 호출이 가능하다.
2. 마찬가지로 인스턴스 멤버끼리는Inner inner = new Inner();객체 생성할 필요 없이h_msg()로 호출이 가능하다.
(같은 Heap 영역에 있기 때문에 가능하다)
3. 하지만 static 멤버에 인스턴스 멤버를 호출 시에는영역이 다르기 때문에따로 객체를 생성해줘야 하고, 반대도 마찬가지로 클래스명을 명시해줘야 한다.
( 클래스명을 안써도 허용을 해주긴 하나 객체를 통해 클래스에 접근하는 거라 좋은 방식이 아니므로 사용 X )
실제로 존재하는 사물 또는 개념을 뜻한다.
클래스를 인스턴스(객체)로 만드는 것을 인스턴스화(객체화) 라고 한다.
여기서 인스턴스화는 사용할 클래스를 복사하여 변수에 넣는 행위를 말한다.
클래스 :
원본
객체 :복사본
원본을 그대로 가져다 사용하면 훼손되기 쉽기 때문에 복사본을 사용하는 것이 객체화이다.
복사된 객체는 변수에 담길 수 있다.
이때 변수의 데이터 타입은 객체의 원본 클래스이다.
Tv tv = new Tv();
Tv tv1 = new Tv();
Tv tv2 = new Tv();
를 만들었을 때 tv1 과 tv2 는 원본이 아닌 복사본이기 때문에 서로 다른 객체이다.
객체화를 할 때 복사본을 만들기 위해 생성자를 호출 한다.
객체화를 할 때 복사본을 만들기 위해 생성자를 호출 한다.
생성자는 객체화 시에 가장 먼저 실행되고, 초기화 하는 수단으로 활용 된다.
초기화는 생성시 최초로 어떤 값을 입력하는 것을 의미한다.
( 모든 걸 0 으로 하는 것이 아님 )
생성자는 class 를 객체화 해준다.
객체화 요청 -> 생성자 호출 -> 객체화 과정 을 거친다.
생성자는 오버로딩(overroading) 이 가능하다.
void 를 붙이진 않는다.public class Dog { public Dog() { ... } }```
매개변수(Parameter) 이 없는 생성자.
생성자가 하나도 없으면 컴파일러가 자동으로 생성자를 추가시켜줘서 생성자 없이도 new 생성자(); 로 객체 생성이 가능했다.

매개변수(Parameter) 이 존재하는 생성자.
매개변수와 초기화할 변수명이 같으면 this 로 구분지어준다.

객체 생성 후 변수를 사용하여 초기화 하는 방법과
생성자를 통해 초기화를 하는 방법 두가지 모두 결과는 동일하다.
과적을 의미한다.
원래는 한 클래스에는 하나의 생성자만 가능하다. 그러다 보니 초기화 할 때 여러 경우를 만들면 그 경우마다 클래스를 만들고 그 많은 클래스를 알아야 하는 번거로움이 생긴다.
그래서 오버로딩 ( overloading ) 이라는 기능을 만들었다.
같은 이름으로 여러개의 생성자를 만드는 것.
다만 매개변수의 갯수나 타입은 달라야 한다.

앞서 본 이미지의 Car() 생성자가 같은 이름으로 2개 있는 것이 오버로딩이다.
이 때 매개변수와 초기화할 인스턴스 변수명이 동일하면 this 로 구분해준다.
( 다르면 구분할 필요가 없어 this 사용하지 않아도 된다.)
한 클래스 안에 같은 이름의 메서드를 여러개 정의하는 것.
(ex) System.out.println() 가 대표적인 오버로딩한 메서드이다.
오버로딩을 사용하지 않았을 경우 더하는 매개변수 마다 각각 다른 이름의 메서드를 사용해야 하기 때문에 사용자 입장에서 불편하다.
오버로딩 사용 시 하나의 이름으로 여러 매개변수를 넣으면 알아서 맞는 타입의 메서드로 연결 되어 편리하다.
오버로딩된 메서드의 기능은 결과적으로 동일한 기능을 구현해야 한다.

오버라이딩 : 부모로부터 물려받은 메서드를 새롭게 덮어 사용하는 것오버로딩 : 한 클래스 안에 같은 이름의 메서드 여러 개 정의하는 것