객체 지향 프로그래밍
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));
}
}
static을 제거하고 객체를 사용하면 각 개체가 독립적으로 계산을 처리할 수 있으며, 객체의 수가 많아져도 새로운 클래스를 마들 필요가 없이 객체만 생성하면 된다.
-> 객제 지향 프로그래밍은 코드의 재사용성과 확장성을 높이고, 클래스와 객체를 통해 독립적인 데이터와 기능을 관리할 수 있다.
클래스
new - 객체를 생성할 때 사용하는 키워드 ex. Animal cat = new Animal() cat은 객체, cat이라는 객체는 Animal의 인스턴스
객체 변수 - 클래스에 선언된 변수, 도트 연산자(.)를 이용하여 접근 가능
cat.name // 객체 : cat, 객체변수 : name
메서드 - 클래스 내의 함수
//setName 메서드
class Animal {
String name;
public void setName(String name) {
this.name = name;
}
}
입력: String name
출력: void('리턴값 없음')
메서드 호출 - 객체.메서드
* 객체 변수의 값은 독립적으로 유지된다 -> 객체 변수는 공유되지 않는다
매개 변수 - 메서드에 전달된 입력값을 저장하는 변수
인수 - 메서드를 호출할 때 전달하는 입력값
메서드 구조
리턴자료형 메서드명(입력자료형1 매개변수1, 입력자료형2 매개변수2, ...) {
...
return 리턴값; // 리턴자료형이 void 인 경우에는 return 문이 필요없다.
}
1. 입력값과 리턴값이 모두 있는 메서드
int sum(int a, int b) {
return a+b;
} //리턴값_받을_변수 = 객체.메서드명(입력인수1, 입력인수2, ...)로 호출 가능
2. 입력값이 없는 메서드
String say() {
return "Hi";
} //리턴값_받을_변수 = 객체.메서드명()로 호출 가능
3. 리턴값이 없는 메서드
void sum(int a, int b) {
System.out.println(a+"과 "+b+"의 합은 "+(a+b)+"입니다.");
} //객체.메서드명(입력인수1, 입력인수2, ...)로 호출 가능
4. 입력값과 리턴값이 모두 없는 메서드
void say() {
System.out.println("Hi");
} //객체.메서드명()로 호출 가능
* 리턴 자료형이 void인 메서드에서는 return 문만 단독으로 사용해 메서드를 빠져나갈 수 있다.
* 메서드 안에서 사용하는 변수는 메서드 밖의 변수와 독립적이기에 이름이 같아도 서로 영향을 주지 않는다.
* 객체 내부 변수를 다룰 때, this 키워드를 사용하면 매개변수 없이 객체에 접근 가능하다.
값에 의한 호출과 객체에 의한 호출
값에 의한 호출 - 메서드에 원시 자료형을 저달할 때, 메서드 내부에서 값이 변경되더라도 외부 변수에는 영향을 주지 않는다
객체에 의한 호출 - 메서드에 객체를 전달할 때, 메서드 내부에서 객체의 속성값을 변경하면 그 변경이 메서드 밖에서도 유지된다
퀴즈
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 키워드를 사용하는 이유?
객체 내부 변수를 다룰 때 this 키워드를 사용하면 매개변수 없이 접근이 가능하다. 주로 메서드 내에서 매개변수와 필드의 이름이 같을 때 필드를 구분하기 위해 사용한다.
3. 필드와 지역 변수의 차이점을 설명하고, this 키워드가 사용되는 이유를 함께 설명하기.
필드는 클래스의 모든 인스턴스에서 공유되고 지역 변수는 메서드 내에서 선언돼 메서드가 실행되는 동안만 유효하다. this 키워드는 메서드 내의 지역 변수와 클래스의 필드를 구분하기 위해 사용된다.
4. 자바에서 call by value와 call by reference의 차이?
call by value는 메서드에 값을 복사해서 전달하는 방식으로 원본 데이터는 변경되지 않는다. call by reference는 객체의 참조를 전달하는 방식으로 메서드에서 객체의 속성을 변경하면 원본 객체도 변경된다.
5. 메서드 내에서 선언된 변수의 효력 범위(scope)란?
메서드 내에서 선언된 변수의 효력 범위는 해당 메서드 내에서만 유효하다.
6. 자바에서 생성자(constructor)의 역할?
생성자는 객체가 생성될 때 호출되고 객체의 초기 상태를 설정하는 데 사용된다.
7. 클래스에서 final 키워드를 사용하는 이유와 그 효과?
final 키워드는 클래스, 메서드, 변수를 수정할 수 없게 만들 때 사용된다.
8. 메서드가 return을 사용하는 이유와 반환되는 값을 처리하는 방법?
return 키워드는 메서드의 실행을 종료하고 결과값을 호출한 곳으로 반환하는 데 사용한다. 반환된 값은 변수에 저장하거나 다른 연산에 사용할 수 있다.
9. 객체를 생성하는 방법과 그 과정에서 new 연산자의 역할?
객체는 클래스의 인스턴스를 생성할 때 new 연산자를 사용하여 생성한다. new는 메모리에 새로운 객체를 할당하고, 클래스의 생성자를 호출하여 초기화하는 역할을 한다.
10. 클래스와 인터페이스의 차이점?
클래스는 인스턴스를 생성할 수 있고 단일 상속만 가능하다. 인터페이스는 인스턴스를 생성할 수 없고 다중 상속이 가능하다.
11. 다음 코드에서 this 키워드가 어떻게 동작하는지 설명하기
public class Test {
int value;
public Test(int value) {
this.value = value;
}
}
this.value = value;는 생성자에 전달된 매개변수의 값을 현재 객체의 인스턴스 변수에 할당해 클래스의 인스턴스 변수를 초기화할 수 있다.
12. 지역 변수와 전역 변수의 차이점?
지역 변수는 메서드, 생성자 또는 블록 내에서 선언되며 해당 범위 내에서만 유효하다. 전역 변수는 클래스 내에서 선언되며, 클래스의 모든 메서드에서 접근할 수 잇다. 자동으로 초기화되고 기본 데이터 타입일 경우 기본값이 할당된다.
코딩테스트
1. 같은 숫자는 싫어
https://school.programmers.co.kr/learn/courses/30/lessons/12906
2. 1번 변형 문제
import java.util.*;
class NumberFilter {
private List<Integer> numbers;
public NumberFilter(int[] numbers) {
this.numbers = new ArrayList<>();
for (int number : numbers) {
this.numbers.add(number);
}
}
public List<Integer> removeConsecutiveDuplicates() {
List<Integer> result = new ArrayList<>();
for (int i = 0; i < numbers.size(); i++) {
if (i == 0 || !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]
}
}
'WINK-(Web & App) > JAVA 스터디' 카테고리의 다른 글
[2024-2 Java 스터디] 김태일 #3주차 (1) | 2024.10.31 |
---|---|
[2024-2 Java 스터디] 강보경 #3주차 (0) | 2024.10.30 |
[2024-2 Java 스터디] 정채은 #2주차 (0) | 2024.10.18 |
[2024-2 Java 스터디] 김지수 #2주차 (2) | 2024.10.18 |
[2024-2 Java 스터디] 김재승 #2주차 (0) | 2024.10.17 |