본문 바로가기

WINK-(Web & App)/JAVA 스터디

[2024-2 Java 스터디] 정채은 #3주차

반응형

5장 ! 

[5 - 1] 객체 지향 프로그래밍이란?

 

계산기를 통해 알아부자

 

1+2+3 = 3+3 = 6

 

1, 2 를 더하고 3을 더할 때 1,2를 더한 값 3 을 저장해두는게 필요하다.

 

이것을 자바로 구현하면

class Calculator {
    static int result = 0;

    static int add(int num) {
        result += num;
        return result;
    }
}


public class Sample {
    public static void main(String[] args) {
        System.out.println(Calculator.add(1));
        System.out.println(Calculator.add(2));
    }
}

 

그런데 2개의 계산기가 필요할때는 어떡할까 

이때는 클래스를 각각 따로 만들어야함 ! 

 

 

 

그런데 만약 많은양의 계산기가 필요할때는?

 

class Calculator {
    int result = 0;

    int add(int num) {
        result += num;
        return result;
    }
}


public class Sample {
    public static void main(String[] args) {
        Calculator cal1 = new Calculator();  // 계산기1 객체를 생성한다.
        Calculator cal2 = new Calculator();  // 계산기2 객체를 생성한다.

        System.out.println(cal1.add(3));
        System.out.println(cal1.add(4));

        System.out.println(cal2.add(3));
        System.out.println(cal2.add(7));
    }
}

 

Calculator 클래스로 만든 별개의 계산기 cal1, cal2 가 객체로서 수행

 

[5-2] 클래스

 

<클래스와 객체>

 

클래스의 아주 중요한 기능: 객체를 만드는 기능 !!!!!!!

class Animal {
}

public class Sample {
    public static void main(String[] args) {
        Animal cat = new Animal();
    }
}

 

new : 객체 생성할 때 사용하는 키워드

 

객체 vs 인스턴스 

인스턴스 : 클래스에 의해 만들어진 객체

 

Animal cat = new Animal() 

cat : 객체   <-------- Animal 의 인스턴스

인스턴스란 객체와 클래스 간의 관계 위주를 설명할 때 사용 ! 

 

 

<객체 변수란?>

객체 변수 :  클래스에 선언된 변수 , 값 대입 O , 

 

{{{{{          by 클래스 ----> 객체                ,              그 클래스에 선언된 변수  ----> 객체 변수           }}}}}

 

객체 변수 접근 : (.) 도트 연산자

class Animal {
    String name;
}

public class Sample {
    public static void main(String[] args) {
        Animal cat = new Animal();
    }
}

: name이라는 String 변수 추가 ----> 객체 변수

<메서드란?>

메서드 : 클래스 내에 구현된 함수

 

객체가 메서드 호출 : 객체.메서드

cat.setName("boby");

 

setName 메서드 호출 한거.  "boby"를 입력값으로 하여 setName 메서드를 호출했기 때문에 setName 메서드의 입력 항목 name에는 "boby"라는 문자열이 전달될 것.

 

 

setName 메서드의 this.name = name; 문장은 다음과 같은 뜻

this.name = "boby";

 

<객체 변수는 공유되지 않는다>

 

클래스에서 가장 중요한 부분은 객체 변수의 값이 독립적으로 유지된다는 점

 

[5-3 메서드 더 살펴보기]

 

<메서드 사용하는 이유>

메서드 사용 이유 : 똑같은 내용을 반복 때

 

int sum(int a, int b) {
    return a+b;

 

return은 메서드의 결괏값을 돌려주는 명령어!

public class Sample {
    int sum(int a, int b) {
        return a + b;
    }

    public static void main(String[] args) {
        int a = 3;
        int b = 4;

        Sample sample = new Sample();
        int c = sample.sum(a, b);

        System.out.println(c);
    }
}

 

출력값 : 7

 

-> Sample 클래스의 main 메서드에서 Sample sample = new Sample()처럼 자기 자신의 객체를 생성

   : 작성한 클래스를 단독으로 실행시켜 테스트할때 사용하는 방법

 

<매개 변수와 인수>

매개 변수 : 메서드에 전달된 입력값을 저장하는 변수

인수 : 메서드를 호출할 때 전달하는 입력값

 

<메서드의 입력값과 리턴값>

입력값 ---> 메서드(블랙박스와 같은 역할을 한다.) ----> 리턴값

 

<메서드의 구조>

리턴자료형 메서드명(입력자료형1 매개변수1, 입력자료형2 매개변수2, ...) {
    ...    
    return 리턴값;  // 리턴자료형이 void 인 경우에는 return 문이 필요없다.
}

 

-메서드의 분류

  • 입력 O 출력 O
  • 입력 X 출력 X 
  • 입력 X 출력 O
  • 입력 O 출력 X

<입력 O 출력 O 메서드>

int sum(int a, int b) {
    return a+b;
}
  • 입력값 : int 자료형 a, int 자료형 b
  • 리턴값 : int 자료형

 

입출력값 O 메서드 호출 :

리턴값_받을_변수 = 객체.메서드명(입력인수1, 입력인수2, ...)  

 

<입력 X 출력 O 메서드>

String say() {
    return "Hi";
}
  • 입력값 : 없음
  • 리턴값 : String 자료형

 

입력 X 출력 O 메서드 호출 :

리턴값_받을_변수 = 객체.메서드명()

 

 

 

<입력 O 출력 X 메서드>

void sum(int a, int b) {
    System.out.println(a+"과 "+b+"의 합은 "+(a+b)+"입니다.");
}

 

  • 입력값 : int 자료형 a, int 자료형 b
  • 리턴값 : void (리턴값 없음)

 리턴값 X 메서드 : 리턴 자료형 부분에 void라고 표기

 

리턴값 X 메서드 호출 : 

객체.메서드명(입력인수1, 입력인수2, ...)

 

<입력 X 출력 X 메서드>

void say() {
    System.out.println("Hi");
}
  • 입력값 : 없음
  • 리턴값 : void

입력 X 출력 X 메서드 호출 : 

객체.메서드명()

 

<return의 또 다른 쓰임>

메서드 빠져나갈 때 : return을 단독 사용 ---> 리턴 자료형이 void인 메서드만 가능

 

<메서드 내에서 선언된 변수의 효력 범위>

public class Sample {
    void varTest(int a) {
        a++;
    }

    public static void main(String[] args) {
        int a = 1;
        Sample sample = new Sample();
        sample.varTest(a);
        System.out.println(a);
    }
}

출력값 : 1

 

왜 2 가 출력안되었는가? 

: 메서드에서 사용한 매개변수는 메서드 안에서만 쓰이는 변수라서 !!!!

 

그러면 해결방법은?

public class Sample {
    int varTest(int a) {
        a++;
        return a;
    }

    public static void main(String[] args) {
        int a = 1;
        Sample sample = new Sample();
        a = sample.varTest(a);
        System.out.println(a);
    }
}

출력값 : 2

 

: varTest 메서드에 return 문을 이용하는 방법

 

이번엔 varTest 입력값이 int 자료형이 아닌 객체인 경우 ?

 

메서드에 값을 전달하는 것과 객체를 전달하는 것 은 큰 차이

객체를 메서드의 입력으로 넘기고 메서드가 객체의 속성값(객체 변수 값)을 변경하면 메서드 수행 이후에 객체는 변경된 속성값 유지

public class Sample {

    int a;  // 객체변수 a

    void varTest(Sample sample) {
        sample.a++;
    }

    public static void main(String[] args) {
        Sample sample = new Sample();
        sample.a = 1;
        sample.varTest(sample);
        System.out.println(sample.a);
    }
}

출력값 : 2 

 

varTest 메서드의 입력 파라미터가 값이 아닌 Sample 클래스의 객체

 

메서드의 입력 항목이 값 or 객체 구별 ? 

: 입력 항목의 자료형이 원시 자료형 인지 아닌지 ! 

                                                                                                  --------------------> 담 장에서 자세히 다룸

  • 원시 자료형 : 값 전달 
  • 그 외 : 객체 전달

[5-4] 값에 의한 호출과 객체에 의한 호출

 

메서드에 객체를 전달할 경우 메서드에서 객체 변수의 값을 변경가능 !

 

class Updater {
    void update(int count) {
        count++;
    }
}

class Counter {
    int count = 0;  // 객체변수
}

public class Sample {
    public static void main(String[] args) {
        Counter myCounter = new Counter();
        System.out.println("before update:"+myCounter.count);
        Updater myUpdater = new Updater();
        myUpdater.update(myCounter.count);
        System.out.println("after update:"+myCounter.count);
    }
}

 

값 변화 X  -----> update 메서드가 값(int 자료형)을 전달받음.

 

 

수정

class Updater {
    void update(Counter counter) {
        counter.count++;
    }
}

class Counter {
    int count = 0;  // 객체변수
}

public class Sample {
    public static void main(String[] args) {
        Counter myCounter = new Counter();
        System.out.println("before update:"+myCounter.count);
        Updater myUpdater = new Updater();
        myUpdater.update(myCounter);
        System.out.println("after update:"+myCounter.count);
    }
}

 

 

 

class Updater {
    void update(int count) {
        count++;
    }
}
class Updater {
    void update(Counter counter) {
        counter.count++;
    }
}

차이점 : update 메서드의 입력 항목 

             즉, 값 전달 ---> 객체 전달 

 

 myUpdater.update(myCounter.count);
myUpdater.update(myCounter);

수정된 부분 :update 메서드를 호출하는 부분

 

퀴즈 !!!!

1. 객체지향 프로그래밍(OOP)의 4대 특징이 아닌 것은? D

  • a) 상속
  • b) 다형성
  • c) 추상화
  • d) 복사

2. 클래스에서 필드와 메서드의 차이점은 무엇인가? A

  • a) 필드는 객체의 상태를 나타내고, 메서드는 동작을 정의한다.
  • b) 필드는 동작을 정의하고, 메서드는 객체의 상태를 나타낸다.
  • c) 필드와 메서드는 동일하다.
  • d) 필드만 객체에 속한다.

3. 다음 중 this 키워드의 역할은 무엇인가? B

  • a) 상속된 메서드를 호출한다.
  • b) 현재 객체를 참조한다.
  • c) 부모 객체를 참조한다.
  • d) 외부 클래스의 필드를 참조한다.

4. 클래스에서 this 키워드를 사용하는 이유는 무엇인가? A 

  • a) 같은 이름의 지역 변수와 필드를 구분하기 위해
  • b) 상속받은 필드를 참조하기 위해
  • c) 메서드 오버라이딩을 위해
  • d) 클래스를 상속하기 위해

5. 메서드의 리턴 타입이 void인 경우, 메서드가 반환하는 값은? C

  • a) null
  • b) 0
  • c) 아무 값도 반환하지 않는다.
  • d) -1

6. 아래 코드에서 출력값은? B(10)

public class Example {
    int a = 5;
    public void setA(int a) {
        this.a = a;
    }
    public static void main(String[] args) {
        Example ex = new Example();
        ex.setA(10);
        System.out.println(ex.a);
    }
}
  • a) 5
  • b) 10
  • c) 0
  • d) 컴파일 에러

7. 매개변수(parameter)와 인자(argument)의 차이는 무엇인가? A

  • a) 매개변수는 메서드 정의 시 사용되고, 인자는 메서드 호출 시 전달된다.
  • b) 인자는 메서드 정의 시 사용되고, 매개변수는 메서드 호출 시 전달된다.
  • c) 매개변수와 인자는 동일한 의미이다.
  • d) 매개변수는 클래스 정의 시 사용되고, 인자는 메서드 정의 시 사용된다.

8. 메서드가 값을 반환하는 데 사용하는 키워드는? A

  • a) return
  • b) break
  • c) exit
  • d) continue

9. 메서드 내에서 선언된 변수의 효력 범위(scope)는? D

  • a) 클래스 전체
  • b) 메서드 전체
  • c) 메서드가 호출된 후에도 유지된다.
  • d) 메서드 내에서만 유효하다.

10. 자바에서 call by value의 의미는? C

  • a) 참조 값을 전달한다.
  • b) 객체를 직접 전달한다.
  • c) 값의 복사본을 전달한다.
  • d) 값의 참조를 전달한다.

11. 객체를 생성할 때 사용하는 키워드는? C

  • a) object
  • b) this
  • c) new
  • d) create

12. 다음 중 클래스 멤버에 해당하지 않는 것은? D

  • a) 필드
  • b) 메서드
  • c) 생성자
  • d) 지역 변수

13. 다음 중 지역 변수와 필드를 구분하는 올바른 방법은? C

  • a) 지역 변수는 this 키워드로 접근한다.
  • b) 필드는 클래스 외부에서 사용할 수 없다.
  • c) 지역 변수는 메서드 내에서만 사용된다.
  • d) 필드는 메서드 내에서만 사용된다.

14. 자바에서 기본 데이터 타입을 객체로 감싸는 클래스는? A

  • a) Wrapper 클래스
  • b) Interface 클래스
  • c) Collection 클래스
  • d) Abstract 클래스

15. 객체의 생성자를 호출하는 역할을 하는 것은? D

  • a) 메서드
  • b) 필드
  • c) 클래스
  • d) new 연산자

16. return 키워드는 언제 사용되는가? (중요) A

  • a) 메서드의 실행을 종료하고 값을 반환할 때
  • b) 메서드의 실행을 반복할 때
  • c) 메서드 실행을 일시 중지할 때
  • d) 메서드 내부에서만 사용될 때

17. call by reference는 무엇을 의미하는가? B

  • a) 값을 복사하여 전달한다.
  • b) 객체의 참조를 전달한다.
  • c) 기본 데이터 타입을 전달한다.
  • d) 메서드를 복사한다.

 

반응형