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) 메서드를 복사한다.
'WINK-(Web & App) > JAVA 스터디' 카테고리의 다른 글
[2024-2 Java 스터디] 김민서 #4주차 (0) | 2024.11.06 |
---|---|
[2024-2 Java 스터디] 김지나 #4주차 "5.5~5.9" (0) | 2024.11.06 |
[2024-2 Java 스터디] 김재승 #3주차 (0) | 2024.10.31 |
[2024-2 Java 스터디] 김규현 #2주차 (0) | 2024.10.31 |
[2024-2 Java 스터디] 이민형 #3주차 (5장) (0) | 2024.10.31 |