본문 바로가기
풀스택/JAVA 정리

(점프투자바 요약) 5장 객체지향 프로그래밍 1

by woohyun22 2019. 2. 11.

==========05-1 클래스


---Class


클래스 - 객체를 만드는 기능

public class Animal{

Animal cat = new Animal();

}


new는 객체 생성할 때 사용함. 생성시 Animal의 인스턴스인 cat, Animal의 객체가 만들어진다.


-cat는 객체


Class는 (과자틀), 과자틀에 의해 만들어진 과자들을 (객체)로 보면된다.

객체는 무수히 많이 만들수 있다.




---객체 변수


public class Animal{     String name;

}


Animal 클래스에 name이라는 String 변수를 추가, 이렇게 선언된 변수는 객체 변수라 불린다.

(객체, 객체변수로 생각하면 쉽다.)


객체변수를 사용할 때는 객체.객체변수를 쓰면된다.


cat.name 으로 쓴다.



---메소드


클래스안에서 구현된 함수를 메소드라 부른다.


1
2
3
4
5
6
7
8
9
10
11
12
public class Animal {
    String name;
 
    public void setName(String name) {
        this.name = name;
    }
 
    public static void main(String[] args) {
        Animal cat = new Animal();
        System.out.println(cat.name);
    }
}
cs



위에서는 setName이 메소드이다. 메소드명뒤의 괄호에는 입력값이 들어가는데 String name을 입력해주면

함수안의 내용이 출력된다. 위는 return값이 없기에 출력안된다.


메소드를 호출하는 형식은 cat.setName("hihit22");이 되는데 이는 String형으로 입력받기 때문이다.

순서는  cat.setName("hihit22"); 로 호출하고 "hihit22"이라는 값이 전달되어 메소드 안은 this.name = "hihit22";

이 된다. 결국 cat.name 에는  = "hihit22"이 들어가게된다.




==========05-2 메소드


앞의 메소드를 간단하게 비유하자면 믹서기를 들수 있는데 입력값인 과일을 넣으면 일을 수행하고, 결과값이 나온다.

메소드를 사용하는 이유는 똑같은 내용을 반복하지 않기 위해서라고 할 수 있다. 예를들면


1
2
3
public int sum(int a, int b) {
    return a+b;
}
cs


위에서는 sum사용시 입력값으로 int형 두개의 값을 받고 결과값으로는 그 두개의 입력값의 합이 나온다.



---메소드는 입출력 유무에 따라 다음과 같이 4가지로 분류할 수 있다.

  • 입력과 출력이 모두 있는 메소드
  • 입력과 출력이 모두 없는 메소드
  • 입력은 없고 출력은 있는 메소드
  • 입력은 있고 출력은 없는 메소드


이것과 메소드 내에서 선언된 변수의 범위는 이미 알기에 넘어간다. 불필요한부분은 줄이자.


==========05-3 Call by value


1
2
3
4
5
class Updater {
    public void update(int count) {
        count++;
    }
}
cs


이것을 쓸때는


1
2
3
4
5
class Updater {
    public void update(Counter counter) {
        counter.count++;
    }
}
cs


밑에 class명이 Counter일때는 그에 해당하는 type(class)를 앞에 적어줘야 count가된다.


==========05-4 상속


상속은 자식이 부모로부터 무언가를 물려받는다 생각하면된다.


1
2
3
4
5
6
7
8
9
10
11
12
public class Dog extends Animal{
    public void sleep() {
        System.out.println(this.name+"zzz");
    }
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.setName("a");
        System.out.println(dog.name);
        dog.sleep();
    }
}
 
cs


Animal이 부모라 하고 dog.java를 만들었을때 위처럼 extends 부모라 적으면된다.

객체 생성후 자식.부모의 메소드를 쓸수 있다.

결국 부모의 메소드를 물려받아 사용하는 것이고 물론 자신의 메소드도 함께 쓸 수 있다.



---IS-A관계

또한 상속을 받을시 

Animal dog = new Dog(); 을 쓸 수 있는데. 

해석하면 Dog로 만든 객체는 Animal 자료형이다. 하지만 반대는 말이 안되므로 안된다.


---메소드 오버라이딩(부모한테 타다)손자가 부모것을 물려받고 또 물려받을수 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
package Pack01;
 
public class HouseDog extends Dog {
    public void sleep() {
        System.out.println(this.name + " zzz in house");
    }
 
    public static void main(String[] args) {
        HouseDog hd = new HouseDog();
        hd.setName("happy");
        hd.sleep();
    }
}
 
cs


위처럼 부모에게 상속받은 것을 또 그밑에 자식이 물려받을수 있다. 

단 자식의 자식이 메소드를 사용시 부모의 같은이름의 메소드가 존재할경우 자식의 메소드가 실행된다.


--메소드 오버로딩(입력항목이 다른 메소드를 여러개만들 수 있다.)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package Pack01;
 
public class HouseDog extends Dog {
    public void sleep() {
        System.out.println(this.name + " zzz in house");
    }
    public void sleep(int hour) {
        System.out.println(this.name + " zzz in house"+hour+"시간동안잔다.");
    }
    public static void main(String[] args) {
        HouseDog hd = new HouseDog();
        hd.setName("happy");
        hd.sleep(4);
    }
}
 
cs


메소드 오버로딩과 메소드 오버라이딩을 꼭 구분하자.


오버로딩은 같은거 여러개쓰는거 입력값다를때

오버라이딩은 손자가 할아버지 등에 탄다.

728x90

댓글