객체 지향 언어의 특징
기본 프로그래밍 언어 + 객체지향 개념 (규칙)
이 개념 규칙을 외워야 함
OOP (Object Oriented Programming) 캡 상추다
1. 캡슐화
2. 상속
3. 추상화
4. 다형성
클래스의 정의 : 객체를 정의해 놓은 것
객체 지향 개념이 생긴 이유는 군사적이 이유로 실제와 같은 가상의 화면을 컴퓨터로 구현해서 시험하고자 하는 욕구 때문? 하드웨어로 소프트웨어화라고 보면 된다.
생각해보면 티브이나 오디오도 현재 하드에서 소프트웨어화 된 사례이다.
어떻게 하면 하드웨어가 소프트웨어화 될 수 있을까? 어떻게 코드를 짤 수 있을까? 고민해보니
하드웨어는 속성(변수)과 기능(메서드)으로 되어 있다.
객체 = 인스턴스
하나의 소스 파일에 여러 클래스가 가능하나 소스파일 하고 일치한 클래스가 하나 있어야 한다. 그리고 public에 소스파일과 같은 이름을 붙여준다. 만약 public이 없다면 디폴트 클래스 중 하나 일치시킨다.
전에 실행시켰는데 엉뚱한 결괏값이 콘솔 창에 나타난 적이 있다. 이는 소스 이름과 클래스 이름이 일치하지 않았기 때문이다 public이 없다면 클래스 중(메인 메서드가 있는) 일치하는 값이 있어야 함을 인지하자
"Run Configuration" 오류 뜰 때가 있는데 마우스 우측으로 찾거나 메뉴창에 Configuration을 찾아서 메인 클래스 이름 확인하고 변경도 가능하다. 자바는 대소문자를 구별하니 잘 살펴야 한다.
리모컨 변수는 하나의 값만 저장이 가능하다 그래서 두 개의 인스턴스를 가리킬 수 없다.
그림 보고 이해하기
객체의 배열을 참조 변수의 배열이라고 하는데 그 이유는 그 참조 변수가 객체를 생성하기 때문이다.
배열 생성을 간단하게 하듯이
객체의 배열도
TV [ ] tvArr= { new Tv(), new Tv(), new Tv() }; 로 나타낼 수 있다.
위의 그림 조금 오랫동안 보고 생각해보기
Tv [ ] tvArr= new Tv [3]; 을 참조 변수만 생성해준 거다, 이렇게 한 후 반드시
tvArr [0] = new Tv();
tvArr [1] = new Tv();
tvArr [2] = new Tv(); 이렇게 객체를 만들어줘야 한다.
그렇다면 한꺼번에
Tv [ ] tvArr = { new Tv(), new Tv(), new Tv() }
요렇게 하면 좋겠다.
클래스의 특징 중 하나가 사용자 정의 타입이라는 것
그래서 Time이라는 클래스를 만들고 그 안에 원하는 변수들을 집어넣는다.
그러면 hour minute second 각각의 객체 생성 필요 없이 Time이라는 객체 생성만 하면 된다.
Time t = new Time();
여기서 배열로 객체 생성을 하려면
Time [ ] t = new Time [3]
t [0] = new Time();
t [1] = new Time(1);
t [2] = new Time(2);
그렇다면 이는 Time [ ] t= {new Time(), new Time(), new Time()} 도 가능한 것인가?
변수의 종류 3가지
iv = 인스턴스 변수, 위치는 클래스 영역 개별속성
cv= iv 앞에 static을 붙인 거다. 위치는 클래스 영역 공통 속성
lv= 지역 변수 , 위치는 메서드 영역
클래스는 선언만 가능하다.
변수 선언이든 메서드 선언이든
그래서 sysout 이라든지 y=+x 이런 식은 클래스 영역에서 사용 불가 \
객체 = iv 묶어 둔 것
iv는 객체 생성을 해야 해서 항상 참조 변수를 생성해야 하지만 cv는 객체 생성 없이 가능함으로 참조 변수 없이
내가 원하는 cv가 있는 클래스 이름을 넣고 찾는다.
예를 들면 Card.weig
참조형 매개변수의 예제 위의 그림
그림 그리는 것 연습하기
static 메서드는 클래스 이름. 메서드 이름() 예를 들면 Math. random();
iv 사용 여부에 따라 인스턴스 메서드냐 static 메서드냐 갈라짐
static 메서드 인스턴스 메서드의 차이점은 결국 iv이다.
iv는 객체 생성을 해야 하고 그렇기 때문에 static은 객체 생성을 안 하기 때문에 iv와 관련이 있는
인스턴스 메서드도 인스턴스 변수도 사용하지 못한다.
결국 핵심은 iv를 사용하냐 못하냐
이 말을 객체 생성을 했냐 못했냐라는 뜻과 같다.
오버 로딩의 조건
메서드 이름은 같지만 매개변수가 다른 것
예를 들면 매개변수 개수가 다르다던가 타입이 다르면 된다
대표적인 오버 로딩 메서드는 println이다.
왜 오버 로딩을 하는가?
메서드 이름이 같다는 건 같은 일을 한다는 것
그래서 오버로딩을 하는 것이다.
생성자란? (메서드다)
인스턴스가 생성될 때 호출되는 초기화
iv 초기화 메서드
우리가 객체를 만들 때 썼던 Card a = new Card(); 여기서 Card()는 사실 생성자 호출이었다.
생성자를 만든 적이 없는데 인스턴스 초기화 메서드인 생성자를 호출할 수 있었던 것 기본 생성자는 생성자가 하나도 없을 때 컴파일러가 자동으로 만들어준다. 그리고 기본 생성자는 매개변수가 없는 생성자를 의미한다.
생성자도 메서드 이기 때문에 형식이 생성자 이름(){} 이런 형식을 가지고 있다. 여기에 매개변수가 없으면 기본 생성자고 매개변수가 있으면 매개변수가 잇는 생성자이다. 생성자 이름은 클래스 이름과 동일하고 하나의 클래스의 하나 이상의 생성자가 있어야 한다. 생성자는 반환을 하지 않기 때문에 void를 써야 하지만 모든 생성자가 동일한 규칙이 있음으로 void를 쓰지 않는다.
변수를 설정하고 보통 객체 생성을 하고 그 객체를 생성한 참조 변수를 이용하여 초기화를 진행한다.
하지만 이 방법이 너무 번거로워 객체 생성과 동시에 초기화를 할 수 있다.
Car c = new Car ("white", i)
이런 식으로 간단하게 초기화하려면 매개변수가 있는 생성자를 만들면 된다.
그리고 객체 생성할 때 그 매개변수가 있는 생성자를 호출하면 된다.
this()를 언제 쓰는지 궁금했는데 헷갈렸는데 드디어 나옴
같은 클래스에서 다른 생성자를 호출할 때 생성자 이름 대신 this()를 쓴다.
그리고 다른 생성자를 호출할 대 첫 줄에 써야 한다.
this()가 같은 클래스 생성자를 부르는 거라면
this는 참조 변수 이다. 인스턴스 참조 변수 그렇기 때문에 객체 주소가 들어있다.
보통 lv와 iv 이 같을 때 헷갈리기 때문에 iv를 this.iv로 쓴다.
원래도 참조 변수. iv 호출해야 하는 건데 귀찮으니깐 생략한 것임
iv는 자동초기화가 된다. 빈번하게 자주 쓰기 때문에
lv는 메서드 이용동안에만 잠시 메모리를 쓰기 때문에 자동 초기화가 되지 않고 반드시 수동 초기화를 해줘야 한다.
멤버 변수의 초기화 여기서 멤버 변수는 iv와 cv를 만한다. lv는 지역변수
명시적 초기화에서 객체 생성 하는 초기화가 이해가 잘 안 되는데
참조 변수의 경우 객체 주소가 있어야 초기화가 된다 볼 수 있다.
즉 참조 변수는 인스턴스가 생성돼야 초기화되었다고 할 수 있기 때문에 참조 변수의 경우 new를 써서 객체 생성으로 초기화한다.
초기화 블록은 거의 쓰지 않는다.
iv초기화 생성자로 하는 것 기억하기
댓글