본문 바로가기

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

[2024-2 Java 스터디] 김태일 #3주차

반응형

05. 객체 지향 프로그래밍

 

05-1 객체 지향 프로그래밍이란?

 

- 자바를 계산기에 비유하자면 위와 같이 계산기를 두개 만들필요 없이 객체를 사용하여 아래와 같이 간단히 해결 가능

- Calculator 클래스로 만든 별개의 계산기 cal1, cal2 가 각각 역할을 수행

- 계산기 cal1, cal2 (이것을 객체라 함) 의 결괏값은 독립적인 값을 유지

class Calculator1 {
    static int result = 0;

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

class Calculator2 {
    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(Calculator1.add(3));
        System.out.println(Calculator1.add(4));

        System.out.println(Calculator2.add(3));
        System.out.println(Calculator2.add(7));
    }
}
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));
    }
}

 

 

05-2 클래스

 

1. 클래스와 객체

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

class Animal {
}

public class Sample {
    public static void main(String[] args) {
        Animal cat = new Animal();  //Animal 클래스인 cat 객체 만들기
    }
}

▲ Animal 클래스는 선언만 있고 내용은 없지만 Animal cat = new Animal() 과 같이 객체를 만드는 기능을 가지고 있다.

 

 

1.1 객체 변수 생성

 

- 객체 : 클래스에 의해 생성되는 것

- 객체 변수 : 클래스에 선언된 변수

class Animal {
    String name;
}

public class Sample {
    public static void main(String[] args) {
        Animal cat = new Animal();
    }
}//객체는 cat이고 객체 변수는 name이다.

 

- 객체 변수는 도트 연산자(.)를 이용해 접근 가능

cat.name  // 객체.객체변수를 통해 접근 가능

 

2. 메서드란?

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

class Animal {
    String name;

    public void setName(String name) { //Animal 클래스 안에 다음 메서드 추가
        this.name = name; //this.name 은 Animal클래스 최상부에 호출한 String name;이다
    }
}
cat.setName("boby");  // 메서드 호출

 

- setName 메서드 형태

  • 입력 : String name
  • 출력 : void ('리턴값 없음'을 의미)

 

3. 객체 변수는 공유되지 않는다

- 객체 변수의 값이 독립적으로 유지

class Animal {
    String name;

    public void setName(String name) {
        this.name = name;
    }
}

public class Sample {
    public static void main(String[] args) {
        Animal cat = new Animal();
        cat.setName("boby");  // 메서드 호출

        Animal dog = new Animal();
        dog.setName("happy");

        System.out.println(cat.name);
        System.out.println(dog.name);
    }
}

 cat.name = "boby" 이후에 dog.name = "happy"가 수행되더라도 cat.name은 happy로 값이 바뀌지 않음

 

 

05-3 메서드 더 살펴보기

- 입력값을 가지고 어떤 일을 수행한 후 결과값을 내어놓는 것이 메서드의 일

 

 

1. 메서드를 사용하는 이유

- 여러번 반복해서 사용 가능 -> 또다시 사용할 만한 가치가 있는 부분이라는 것을 의미

 

  • 메서드의 정의
int sum(int a, int b) {
    return a+b;
}
//“sum 메서드는 입력값으로 두개의 값(int 자료형 a, int 자료형 b)을 받으며 
//리턴값은 두 개의 입력값을 더한 값(int 자료형)이다.”

 

2. 매개 변수와 인수

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

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

public class Sample {
    int sum(int a, int b) {  // a, b 는 매개변수
        return a+b;
    }

    public static void main(String[] args) {
        Sample sample = new Sample();
        int c = sample.sum(3, 4);  // 3, 4는 인수

        System.out.println(c);
    }
}

 

3. 입력값과 리턴값 모두 없는 메서드의 사용법

public class Sample {
    void say() {
        System.out.println("Hi");
    }

    public static void main(String[] args) {
        Sample sample = new Sample();
        sample.say();
    }
}

 

 

4. return의 또 다른 쓰임

- return을 단독으로 사용하여 메서드 즉시 빠져나옴

public class Sample {
    void sayNick(String nick) {
        if ("바보".equals(nick)) {
            return;
        }
        System.out.println("나의 별명은 "+nick+" 입니다.");
    }

    public static void main(String[] args) {
        Sample sample = new Sample();
        sample.sayNick("야호");
        sample.sayNick("바보");  // 출력되지 않는다.
    }
}

 

5. 메서드 내에서 선언된 변수의 효력 범위

- 메서드에서 사용한 매개변수는 매서드 안에서만 쓰이는 변수이므로 매서드 밖 변수 a와는 다름

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); //a는 2가 아닌 1이 출력
    }
}

※ varTest 메서드에 return문을 사용하여 main에서 a에 대입을 해주어야 1 증가되는것이 적용

     혹은 sample.a++ 를 사용하여 Sample클래스에 객체 변수 a를 설정 후 증가해주어야 함

     혹은 this.a 를 사용하여 객체변수 a의 값을 증가해주어야 함

 

 

05-4 값에 의한 호출과 객체에 의한 호출

- 메서드에 객체를 전달할 경우 메서드에서 객체 변수의 값을 변경할 수 있음

class Updater {
    void update(Counter count) {
        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.count);
        System.out.println("after update:"+myCounter.count);
    }
}
//before update:0
//after update:1

 

객관식 문제

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

답: d) 복사

 

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

답 : a) 필드는 객체의 상태를 나타내고, 메서드는 동작을 정의한다.

 

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

답 : b) 현재 객체를 참조한다.

 

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

답 : a) 같은 이름의 지역 변수와 필드를 구분하기 위해

 

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

답 : c) 아무 값도 반환하지 않는다.

 

6. 아래 코드에서 출력값은?

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);
    }
}

답 : b) 10

 

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

답 : a) 매개변수는 메서드 정의 시 사용되고, 인자는 메서드 호출 시 전달된다

 

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

답 : a) return

 

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

답 : d) 메서드 내에서만 유효하다.

 

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

답 : c) 값의 복사본을 전달한다.

 

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

답 : c) new

 

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

답 : d) 지역 변수

 

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

답 : c) 지역 변수는 메서드 내에서만 사용된다.

 

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

답 : a) Wrapper 클래스

 

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

답 : d) new 연산자

 

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

답 : a) 메서드의 실행을 종료하고 값을 반환할 때

 

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

답 : b) 객체의 참조를 전달한다.

 

서술형 문제

1. 클래스와 객체의 차이점?

클래스는 객체를 만드는 기능을 가지고 있고 객체는 클래스에 의해 생성되는 것이다.

 

2. this 키워드를 사용하는 이유?

생성자의 매개변수 이름과 필드에서 선언한 이름이 같을 때 필드에서 선언한 이름을 가르키기 위해서 사용

(이름이 동일할 때 구분하기 위함)

 

3. 매개변수와 인자의 차이점?

매개변수는 메서드를 만들 때 사용하는 것이고 인자는 메서드를 호출할 때 사용하는 것이다.

 

4. 필드와 지역 변수의 차이점을 설명하고, this 키워드가 사용되는 이유를 함께 설명하기.

필드는 클래스 안에 있는 변수이고, 지역변수는 메서드 안에서 설정된 변수이다. 따라서 지역변수는 메서드 내에서만 사용이 가능한데 이것을 필드에 값에 적용시킬 때 this를 통해서 필드를 참조할 수 있다.

 

5. 자바에서 call by value와 call by reference의 차이?

call by value는 값을 복사하여 전달하는 것이고, call by reference는 참조형 자료를 복사하여 전달하는 것이다. call by value는 값을 그대로 복사하기때문에 내부의 값이 수정이 안되지만, call by reference는 주소를 복사하므로 객체 내부의 값이 수정 가능하다.

 

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

메서드 내부에서만 사용 가능하다.

 

7. 자바에서 생성자(constructor)의 역할?

객체가 생설될 때 호출되는데 이때 객체를 초기화하는 역할을 한다.

 

8. 클래스에서 final 키워드를 사용하는 이유와 그 효과?

final키워드를 사용함으로서 변수가 변하지 않도록 한다. 이렇게 하면 상수로 고정을 할 수 있어 값이 바뀌지 않아야 할 때 유용하다.

클래스에 final 키워드를 사용하면 자식 클래스를 생성할 수 없다.

 

9. 메서드가 return을 사용하는 이유와 반환되는 값을 처리하는 방법?

return을 사용하는 이유는 값을 반환하기 위해서이고, 이 반환되는 값을 변수로 설정하거나 다른 메서드의 인자로 설정할 수 있다

 

10. 객체를 생성하는 방법과 그 과정에서 new 연산자의 역할?

객체는 ('클래스이름' '객체이름' = new '클래스이름')을 통해 생성할 수 있는데 여기서 new는 새로운 객체를 생성하는 역할을 한다.

 

11. 클래스와 인터페이스의 차이점?

인터페이스는 메서드의 틀을 정의하고 그 틀을 통해 구현하는 것이 클래스이다.

 

12. 다음 코드에서 this 키워드가 어떻게 동작하는지 설명하기

public class Test {
    int value;
    public Test(int value) {
        this.value = value;
    }
}

다른 메서드에서 Test() 괄호안에 인자로 수를 넣는다면 그 수는 Test메서드의 매개변수인 value로 전달되고 this 키워드는 그 값이 필드의 value에 할당이 되도록 한다.

 

13. 지역 변수와 전역 변수의 차이점?

지역 변수는 모든 메서드에서 접근이 가능하지만 전역 변수는 해당된 메서드 내에서만 접근이 가능하다.

 

코딩테스트 문제

  1. 같은 숫자는 싫어
 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

2. 1번 변형 문제 (반드시 1번을 먼저 해결한 후, 풀어주세요!)

  • 아래 코드는 1번 문제를 해결하기 위한 코드이다. 주어진 코드에서 class를 완성시켜 프로그램을 실행했을 때, 올바른 결과가 출력되도록 만드시오.

출력 결과: [1, 3, 0, 1]

import java.util.*;

class NumberFilter {
    private List<Integer> numbers;

    public NumberFilter(int[] numbers) {
        this.numbers = new ArrayList<>();
        for (int num : numbers) {
            this.numbers.add(num);
        }
    }
    
    public List<Integer> removeConsecutiveDuplicates() {
        List<Integer> result = new ArrayList<>();
        
        result.add(numbers.get(0));
        
        for (int i = 1; i < numbers.size(); i++) {
            if (!numbers.get(i).equals(numbers.get(i - 1))) {
                result.add(numbers.get(i));
            }
        }
        
        return result;
    }
}

public class Main {
    public static void main(String[] args) {
        int[] arr = {1, 1, 3, 3, 0, 1, 1};

        NumberFilter numberFilter = new NumberFilter(arr);

        List<Integer> filteredNumbers = numberFilter.removeConsecutiveDuplicates();
        System.out.println(filteredNumbers);  // [1, 3, 0, 1]
    }
}

 

반응형