day10 review

클래스: 정보를 쉽게 관리하기 위해 만드는 것

클래스의 구성
- 멤버변수		: 정보
- 메소드		  : 기능
- 생성자		  : 정보를 초기화

클래스 만드는 과정
1. 멤버변수	: 꼭 먼저 필요
2. 생성자	: 생성자는 멤버변수를 초기화하는 것이기 때문에 멤버변수가 먼저임.
3. 멤버메소드	: -

    예1)
    한국인 클래스를 만들기
    멤버변수 : 이름, 성별, 주민번호, 나이, 주소 등
    예2)	
    상품 클래스
    멤버변수 : 카테고리, 상품명, 재고량, 판매량, 가격 등

접근제한자 종류
1. public	    : 본인클래스 + 같은패키지 + 자식클래스 + 다른 패키지
2. protected	: 본인클래스 + 같은패키지 + 자식클래스
3. (default)	: 본인클래스 + 같은패키지
4. private	  : 본인클래스

생성자

멤버변수 초기화	: 일반 변수인 경우 => 초기값을 설정
                참조 변수인 경우 => 객체를 생성

생성자의 특징	: 생성자의 이름은 클래스명과 같다.
	생성자는 객체를 생성할 때, 자동으로 호출된다.
	생성자는 객체를 생성할 때를 제외하고 임의로 호출할 수 없다. (new랑 같이 쓰는데, 그때 자동으로 호출됨.)
		예) Point pt = new Point();	-> 객체생성할 때, 자동으로 생성자가 호출된 상황
		잘못된 예) pt.Point();	-> 생성자를 이렇게 호출할 수 없음.
	생성자가 없는 경우, 기본 생성자가 만들어진다.
	생성자는 여러개 있을 수 있다. (= 생성자 오버로딩)
			*생성자 오버로딩?
				- 생성자 오버로딩은 매개변수의 종류나 수가 다른 경우 만들 수 있다.
				- 매개변수의 갯수가 다른 경우 가능 (예: 기본생성자, 생성자(int num3, num4) => 매개변수 갯수가 다름)
				- 매개변수의 타입이 다른 경우 가능 (예: 생성자(int num3, int num4), 생성자(double num5, double num6)
					=> 매개변수 갯수는 같지만 타입이 달라서 가능/ 타입이 하나만 달라도 가능함)

리턴타입	: 없음. (void가 아니라 아예 리턴타입 항목이 존재 하지 않음)
		잘못된 예)	public 클래스명(){}
		잘못된 예)	public void 클래스명(){}	=> void가 붙으면 생성자가 아니라 메소드가 됨.

복사 생성자	: 생성자의 매개변수로 같은 클래스의 객체가 오는 경우
			public 클래스명(클래스명 객체명){}
				
			this 객체(혼공자 p.272)
				- 클래스 안에서만 사용(멤버 메소드, 생성자에서 사용가능)
				- 객체인데 "나"를 의미
				- 매개변수의 이름과 멤버 변수의 이름이 같은 경우, (멤버변수 앞에 this. 으로)필수로 사용
				- this() : 해당 클래스의 생성자
					this()생성자는 생성자안에서 첫줄에 와야한다.

오버로딩

같은 이름의 메소드/생성자가 여러개인 경우 매개변수가 다른 경우에 가능
	1. 매개변수의 갯수가 다른 경우
	2. 매개변수의 갯수가 같지만 타입이 다른 경우
			
종류:		생성자 오버로딩
				메소드 오버로딩

<수업 외 설명>

메소드 매개변수의 갯수를 모를 때 사용가능
1. 배열
2. ...

일반변수 				vs		  	참조변수
- 기본타입 변수	           - 기본타입이 아닌 변수
- 값을 저장	               - 주소를 저장
- 예) int, char, double..	 -예) 배열, String, 클래스, 열거형 등

멤버변수				vs		 	 지역변수
- 해당 클래스 안 전체	    - 변수가 선언된 위치에서 포함된 범위

객체 멤버 변수 		     vs			클래스 멤버 변수(정적 멤버 변수, static이 붙은)
- 멤버변수를 호출할 때,	        - 멤버변수를 호출할 때, 클래스 이름으로 호출
  객체이름으로 호출
- 객체명. 멤버변수명	          - 클래스명.멤버변수명(객체명, 멤버변수명도 가능)
- static이 없음	              - static이 있음
- 객체 당 하나씩 존재          	- 클래스 당 하나씩 존재(모든 객체가 공유)

      예)
      기아 자동차 클래스
      	-멤버변수        : 제조사, 차명, 생산량(기아자동차 생산량)
      	- 객체 멤버변수	: 차명
      	- 클래스 멤버변수	: 제조사(하나의 이름으로 모든 차들을 대표할 수 있음), 생산량(자동차 마다 생산량을 가진게 아니라 클래스가 가지고 있음)
      		=공유하는

객체 멤버 메소드 		vs		        	클래스 멤버메소드
-static 없음 =객체			           	-static 있음 = 클래스
-객체.메소드명() 으로 호출			    -클래스.메소드명 으로 호출(Math.random())
-각 객체마다 메소드를 가지고 있음		-하나의 클래스가 메소드를 가지고 있음

		클래스 멤버변수/메소드와 객체 멤버 변수/메소드의 사용시 유의 사항
			- 클래스 멤버변수/메소드는 객체 메소드에서 사용 가능
			- 클래스 멤버변수는 클래스 메소드에서 사용 가능
			- 객체 멤버변수/메소드는 클래스 메소드에서 사용 불가능
			- 객체 멤버변수는 객체메소드에서 사용 가능
   		- 클래스 변수 /메소드는 클래스가 메모리에 올라갈 때 선언
    	- 객체 변수/메소드는 객체가 생성될 때 선언
    	- 클래스 메소드가 호출된 시점에 객체가 만들어져 있는지 안만들어져 있는지 알 수 없고, 
        어떤 객체의 정보를 출력해야할지 모르기 때문에 클래스 메소드에서는 객체 변수/메소드를 호출할 수 없다.

final : 변경이 불가능 ==> 메소드&클래스 final은 나중에 상속을 배우고나서 배울 예정.
- 변수	: 변수 앞에 final이 붙으면 => 상수가 됨.
- 상수가 되면 값을 수정/변경할 수 없음.
- 생성자에서 final 변수를 초기화할 수 있다. 단 한 번 초기화 한 후에는 변경할 수 없다.
- 메소드	: 메소드 앞에 final이 붙으면 => 메소드 오버라이딩 불가능
- 클래스	: 클래스 앞에 final이 붙으면 => 상속이 불가능 (예: String)-> 앞에 final이 붙어있대..