오늘은 불금 금요일이고 상태는 나쁘지 않다. 오늘은 클래스, 객체, 생성자, 내부클래스에 대해서 다시 한번 생각해 볼 수 있는 시간이였고, 짧게 블로깅에 대해서 배웠다. 내가 지금까지 썼던 블로깅은 거의 일기였던 것.. 오늘 부터라도 블로깅에 대해서도 공부하고 연구해 보아야 겠다고 생각했다.
자. 객체지향에 대해서 총 정리를 해보겠다.
실제 생활에서는 무언가를 만드려면 설계도가 필요하고 그 설계도를 통해 만든 것은 움직이게 된다. 뭐 사람을 설계해서 만드냐 라고 말할 수 도 있지만. 사람이란 것을 만드는 것 보단, 사람이 움직이고 생각하고 실생활에 일어나는 것을 컴퓨터가 묘사하는 것을 객체 지향이라고 생각 하기로 했다.
클래스 -> 객체를 설계하기 위한 설계도 역할을 한다.
class 클래스이름 {
}
이렇게 선언한다.
그렇다면 객체 --> 인스턴스란 무엇인가.
객체는 속성을 가지고 기능을 가진다. 예를 들면 자동차는 색, 이름, 바퀴 등등등 속성을 가지고 있고, 기능은 스포츠모드, 루프탑 기능등
속성과 기능을 가지고 있는데. 그것을 클래스 내부에 필드, 메서드로 나타내게 된다.
즉
public class Zoo {
//이 부분은 필드 ---> 속성을 나타냄
public admire admire;
private String location;
private static int animalCount;
private static int valueAniamal;
private static final int enterPrice=5000;
private static int sum;
private static int peopleCount;
}
동물원을 예로 들면 지역, 동물 수, 입장료 등등등 속성을 가지고 있고,
public class Zoo {
//이 부분은 필드 ---> 속성을 나타냄
public admire admire;
private String location;
private static int animalCount;
private static int valueAniamal;
private static final int enterPrice=5000;
private static int sum;
private static int peopleCount;
public void suckers(){
System.out.println("서커스를 보여드립니다.");
}
public void perade(){
System.out.println("퍼레이드를 보여드립니다.");
}
public void hello(){
System.out.printf("%s에 방문해 주셔서 감사합니다.",this.location);
}
}
}
서커스, 인사, 등등 기능을 담당하는 것을 메서드로 나타내게 된다. 여기까지가 클래스와 객체에 대한 말이었고, 객체 == 인스턴스 이지만 좀더 새밀하게 나타내자면 객체는 포괄적인 의미이고 인스턴스는 특정 클래스에서 나온 객체라는 정확한 말이다.
오늘의 중요부분은 생성자 였다.
생성자는 객체를 생성하는 메서드가 아닌, 객체를 생성하기 위해 편리하게 초기화 시킬 수 있는 메서드이다.
즉
반환 타입이없고, 클래스의 이름과 동일한 메서드이다. 원하는 속성을 파라메타로 가지고 선언과 동시에 초기화 할 수 있다.
여기서 생성자가 두가지 인 이유가 있다.
여기서 메서드 오버라이딩이라는 기법이 들어가는데.
void hello(){
}
void hello(int i){
}
void hello(int i, int j){
}
void hello(String s){
}
이 와같이 입력하고자 하는 값이 명확하지 않고, 항상 데이터 타입이 바뀌는 상황이라면 그 바뀌는 상황마다 새로운 메서드를 만들어 준다면
메모리 낭비가 너무 심할 것이고, 그 메서드가 뭔지 찾기도 쉽지 않기 때문에, 이를 방지하기 위해 같은 이름으로 여러가지 타입을 받을 수 있게 해주는 것이다.
*이것이 적용이 된 생성자*
원하는 형식으로 초기화를 시키면 다른 생성자를 호출시켜 자동으로 완성시키던가. 직접 더 추가해주던가 유동성 있게 해결 할 수 있다는 것이다.
public class Zoo {
//이 부분은 필드 ---> 속성을 나타냄
public admire admire;
private String location;
private static int animalCount;
private static int valueAniamal;
private static final int enterPrice=5000;
private static int sum;
private static int peopleCount;
//여기부터는 생성자 --> 객체 생성을 편하게 하기 위해 초기화 기능
public Zoo(String location) {
this(location,1);
this.location = location;
System.out.println("생성자1");
}
public Zoo(String location, int peopleCount) {
this.location = location;
this.peopleCount += peopleCount;
sum +=enterPrice*peopleCount;
// this.admire = new admire();
System.out.println("생성자2");
}
}
내부 클래스란, 큰 클래스 안에서 클래스를 하나 더 생성해 주는 것으로 외부 클래스와 연관이 있을 때 주로 사용한다고 한다.
내부 클래스도 같이 내부 클래스 내부 정적 클래스로 나뉘고,
정적 클래스는 JVM로드시 생성되기 때문에, 외부 클래스의 인스턴스 변수나 인스터스 메서드를 이용할 수 없고, 정적만 사용가능하다. 밑에는 예시로 짠 코드이다.
public class Zoo {
//이 부분은 필드 ---> 속성을 나타냄
public admire admire;
private String location;
private static int animalCount;
private static int valueAniamal;
private static final int enterPrice=5000;
private static int sum;
private static int peopleCount;
//여기부터는 생성자 --> 객체 생성을 편하게 하기 위해 초기화 기능
public Zoo(String location) {
this(location,1);
this.location = location;
System.out.println("생성자1");
}
public Zoo(String location, int peopleCount) {
this.location = location;
this.peopleCount += peopleCount;
sum +=enterPrice*peopleCount;
// this.admire = new admire();
System.out.println("생성자2");
}
@Override
public String toString() {
return "Zoo{" +
"location='" + location + '\'' +
'}';
}
public void suckers(){
System.out.println("서커스를 보여드립니다.");
}
public void perade(){
System.out.println("퍼레이드를 보여드립니다.");
}
public void hello(){
System.out.printf("%s에 방문해 주셔서 감사합니다.",this.location);
}
//내부 클래스 생성
class admire{
public admire() {
}
public void print() {
System.out.println(sum);
System.out.println(location);
}
public void get(){
location="서울시에서 나가";
System.out.println(location);
}
}
public String getLocation() {
return location;
}
public static int getAnimalCount() {
return animalCount;
}
public static int getValueAniamal() {
return valueAniamal;
}
public static int getSum() {
return sum;
}
public static int getPeopleCount() {
return peopleCount;
}
}
Person(String name, String occupation, int age) {
this(name, occupation, age, false);
System.out.println("두 번째 생성자");
}
Person(String name, String occupation, int age, boolean isSingle) {
System.out.println("세 번째 생성자");
this.name = name;
this.occupation = occupation;
this.age = age;
this.isSingle = isSingle;
}
만약 이런 상황에 두번째 생성자가 불리게 된다면 this줄이 먼저 실행되어서 세 번째 생성자가 호출되고, 모두 실행한 후 sysout을 실행하게 된다.
앞으로는 더 발전된 블로깅 실력으로 늘려가겠다고 다짐.