5-1. 객체는 왜 필요할까
계산기를 자바로 구현할 수 있음
근데 여러 개를 구현하려면? 각각의 계산기는 값이 유지되어야함
객체를 모른다면
계산기 여러 대의 클래스를 각각 만듬
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));
}
}
new를 통해 객체를 생성
계산기 수가 늘어나더라도 객체만 생성하면 되기에 매우 간단
기능을 추가하려면 Calculator 클래스에 sub 메서드 추가하면 됨
5-2. 클래스와 객체
class Animal {
} // 클래스 선언만 있고 내용은 없는 간단한 형태의 클래스
public class Sample {
public static void main(String[] args) {
Animal cat = new Animal(); // 객체 생성
}
}
클래스
→ 객체를 생성
위의 코드에서는 Animal 클래스의 인스턴스인 cat, Animal 객체가 생성됨
객체 vs 인스턴스
인스턴스
→ 클래스에 의해 만들어진 객체
객체와 인스턴스는 관계로 설명
Animal cat = new Animal();
cat은 객체이다.
cat은 Animal의 인스턴스이다.
객체변수
→ 클래스에 선언된 변수
클래스에 의해 생성되는 것은 객체 / 클래스에 선언된 변수는 객체 변수
(객체 변수 → 인스턴스 변수, 멤버 변수, 속성 이라고도 함)
객체변수는 도트 연산자를 이용해 접근가능
→ 객체.객체변수
class Animal {
String name;
}
public class Sample {
public static void main(String[] args) {
Animal cat = new Animal();
}
}
cat.name // 객체: cat, 객체변수: name
System.out.println(cat.name); // null 출력. 변수로 name을 선언했지만 값을 대입 안 했기 떄문
메서드
→ 클래스 내에 구현된 함수
메서드를 이용하여 객체 변수에 값 대입하기
class Animal {
String name;
public void setName(String name) {
this.name = name;
} // Animal 클래스에 추가된 setName 메서드
}
public class Sample {
public static void main(String[] args) {
Animal cat = new Animal();
System.out.println(cat.name);
}
}
public void setName(String name) { this.name = name; }
public : 접근제어자, public으로 선언된 메서드는 클래스 외부에서 접근 가능 = 다른 클래스에서 호출 가능
void : 출력, 리턴값 없음을 의미
setName : 메서드 이름
String name : 입력, 메서드의 매개변수
리턴값 없음이 뭘까요?
public void hello() {
System.out.println("Hello, World!");
}
이 코드를 실행하면 분명 Hello World!가 출력될텐데 리턴값이라는 것과 출력되는 것은 다른건가? 헷갈려서
정확하게 알아보려고 찾아봤습니다.
리턴값이 있다
public int add(int a, int b) {
return a + b;
}
다음 코드는 add라는 메서드가 두 숫자의 합이 반환됩니다. 리턴값이 있습니다.
int sum = add(5, 3); // sum은 8이 됩니다.
이렇게 add메서드를 호출하면 두 숫자의 합이 반환되며 값을 변수에 저장하거나 다른 연산에 사용할 수 있습니다.
그럼 반대로 리턴값 없으면 이런 게 안된다는 소리
이해 완 ^0^ 다시 본론으로 돌아가보겠습니다.
객체가 메서드 호출
객체 변수와 마찬가지로 도트연산자로 접근
→ 객체.메서드
cat.setName("애용");
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("애용"); // 메서드 호출
System.out.println(cat.name);
}
}
cat.setName("애용")
→ "애용" 을 입력값으로 setName 메서드 호출
∴ setName 메서드의 this.name = name; 문장은 this.name = "애용"; 과 같은 뜻
this : Animal 클래스에 의해 생성된 객체 지칭
∴ Aniaml cat = new Animal(); 으로 cat 객체 생성
→ cat.setName("애용"); 으로 cat객체를 사용하여 setName 메서드를 호출
→ setName 메서드 내부에 선언된 this 는 cat 객체 지칭
∴ this.name = "애용"; 문장은 다시 cat.name = "애용"; 으로 해석 됨
객체 변수의 공유
→ 안됨, 객체 변수의 값은 독립적으로 유지
5-3. 메서드
다른 프로그래밍 언어 → 함수 별도 존재 (함수와 메서드가 동시에 존재한다면 두개를 구분해서 말함 ex. 파이썬)
JAVA → 클래스 내에 존재 → 메서드(method)
메서드는
입력값을 가지고 어떤 일을 수행한 다음에 결과값을 내어놓는 것
메서드를 사용하는 이유
→ 반복사용에 필요
int sum(int a, int b) {
return a+b;
}
/* sum 메서드는 입력값으로 두개의 값(int 자료형 a,b)을 받으며
리턴값은 두 개의 입력값을 더한 값(int 자료형)이다. */
return
→ 메서드의 결괏값을 돌려주는 명렁어
public class Sample { //Sample 클래스
int sum(int a, int b) { //sum 메서드
return a + b;
}
public static void main(String[] args) {
int a = 3;
int b = 4;
Sample sample = new Sample(); //sample 객체 생성
int c = sample.sum(a, b); //sample 객체에 메서드 호출 이 값을 int 자료형 c에 저장
System.out.println(c); //c print
}
}
매개변수 → 메서드에 전달된 입력값을 저장하는 변수
인수 → 메서드를 호출할 때 전달하는 입력값
*주의*
같은 의미를 가진 용어들을 주의하자
ex. 입력값 = 메서드의 인수, 매개 변수
결과값 = 출력값, 리턴값, 반환 값, 돌려주는 값
메서드의 구조
리턴자료형 메서드명(입력자료형1 매개변수1, 입력자료형2 매개변수2, ...) {
...
return 리턴값; // 리턴자료형이 void 인 경우에는 return 문이 필요없다.
}
리턴자료형 : 메서드 수행 후 리턴되는 값의 자료형
메서드의 구분
- 입력 O 출력 O
- 입력 X 출력 X
- 입력 O 출력 X
- 입력 X 출력 O
1. 입력값과 리턴값이 모두 있는 메서드
리턴값_받을_변수 = 객체.메서드명(입력인수1, 입력인수2, ...)
리턴값을 저장하는 변수의 자료형은 리턴자료형과 같아야한다.
2. 입력값이 없는 메서드
리턴값_받을_변수 = 객체.메서드명()
3. 리턴값이 없는 메서드
객체.메서드명(입력인수1, 입력인수2, ...)
4. 입력값과 리턴값이 모두 없는 메서드
객체.메서드명()
return의 다른 용도
→ return을 단독으로 사용해 메서드를 즉시 빠져나갈 수 있다. ( 리턴 자료형이 void인 메서드만 가능 )
public class Sample {
void sayNick(String nick) {
if ("바보".equals(nick)) { //equals 메서드는 문자열을 비교할 때 사용하는 메서드
return;
}
System.out.println("나의 별명은 "+nick+" 입니다.");
}
public static void main(String[] args) {
Sample sample = new Sample();
sample.sayNick("냉면");
sample.sayNick("바보"); // 출력되지 않는다.
}
}
sayNick의 리턴값은 없다.
문자열을 출력한다 = 리턴값이 있다. (X)
이 메서드는 입력값으로 '바보'라는 값이 들어오면 문자열을 출력하지 않고 메서드를 즉시 빠져나간다.
메서드 내에서 선언된 변수의 효력 범위
→ 메서드에서 쓰이는 매개 변수의 이름과 메서드 밖의 변수 이름이 같더라도 서로 영향 X
public class Sample {
int varTest(int a) {
a++;
return a;
}
public static void main(String[] args) {
int a = 1; // main 메서드 내에서 a = 1
Sample sample = new Sample();
a = sample.varTest(a); // a의 값은 1, main 메서드의 a값(1)을 varTest 메서드에 전달
System.out.println(a); // varTest 메서드는 받은 값으로 실행 후 결과값 2를 반환
}
}
메서드에 값을 전달하는 것과 객체를 전달하는 것은 다름.
객체를 메서드의 입력으로 넘김 → 메서드가 객체의 속성값 변경 → 메서드 수행 이후 객체는 변경된 속성값을 유지
public class Sample {
int a; // 1. 객체변수 a
void varTest(Sample sample) {
sample.a++; // 4. 객체를 입력받아 a값을 1만큼 증가
}
public static void main(String[] args) {
Sample sample = new Sample();
sample.a = 1; // 2. 객체 변수 a의 값을 1로 지정
sample.varTest(sample); // 3. 메서드 호출시 객체 sample 전달
System.out.println(sample.a);
}
}
메서드가 객체를 전달 받을 시 메서드 내의 객체는 전달받은 객체 그 자체로 수행
this 키워드 사용으로 객체를 전달 안 해도 됨
public class Sample {
int a; // 객체변수 a
void varTest() {
this.a++;
}
public static void main(String[] args) {
Sample sample = new Sample();
sample.a = 1;
sample.varTest();
System.out.println(sample.a);
}
}
5-4. 값에 의한 호출과 객체에 의한 호출
메서드에 객체 전달 시 → 메서드에서 객체 변수의 값 변경 가능
Quiz
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) 객체의 참조를 전달한다.
서술형
- 클래스와 객체의 차이점은?
클래스는 쿠키틀, 객체는 쿠키틀로 찍혀 나온 쿠키
- this 키워드를 사용하는 이유?
현재 객체를 참조하기 위해서
- 매개변수와 인자의 차이점?
매개변수는 메서드에서, 인자는 메서드 호출 시 전달
- 필드와 지역 변수의 차이점을 설명하고, this 키워드가 사용되는 이유를 함께 설명하기
필드는 클래스 내에서 선언된 변수, 지역변수는 메서드 내에서 선언된 변수로 this 키워드는 필드와 매개변수 이름이 동일 할 때 구분하기 위해 사용한다.
- 자바에서 call by value와 call by reference 의 차이?
call by value : 함수에 매개변수로 값을 전달
call by reference : 함수에 매개변수로 참조를 전달
- 메서드 내에서 선언된 변수의 효력 범위(scope)란?
메서드 내에서만 유효
- 자바에서 생성자의 역할?
객체를 생성할 때 객체의 초기 상태를 설정
- 클래스에서 final 키워드를 사용하는 이유와 그 효과?
fincal 키워드는 클래스, 메서드, 변수 등에 사용 가능하며 불변성을 갖게 해준다.
- 메서드가 return을 사용하는 이유와 반환되는 값을 처리하는 방법?
메서드의 값을 반환하거나 메서드를 종료할 때 사용하며 반환 된 값을 다른 변수에 넣거나 활용함
- 객체를 생성하는 방법과 그 과정에서 new 연산자의 역할?
new 연산자로 객체를 생성
- 클래스와 인터페이스의 차이점?
클래스는 객체를 생성하기 위함으로 실제 구현하지만, 인터페이스는 메서드의 시그니처만 정의할 뿐 구현하지않음
- 다음 코드에서 this 키워드가 어떻게 동작하는지 설명하기
public class Test {
int value;
public Test(int value) {
this.value = value;
}
}
현재 객체의 value 필드를 참조
- 지역변수와 전역변수의 차이점?
지역변수는 메서드 내에서만 유효하며 전역변수는 클래스 내에서 여러 메서드로 접근 가능
코테
모르겠어요..
죄송합니다.... 빠른 시일 내에 풀도록 하겠습니다...
코테 빼고 블로깅 다 해놓겠습니다...
'WINK-(Web & App) > JAVA 스터디' 카테고리의 다른 글
Java[2024-2 Java 스터디] 이민형 #4주차 (5-5장) (0) | 2024.11.07 |
---|---|
[2024-2 Java 스터디] 김지수 #4주차 (0) | 2024.11.07 |
[2024-2 Java 스터디] 이가인 #4주차 (0) | 2024.11.07 |
[2024-2 Java 스터디] 정채은 #4주차 (3) | 2024.11.07 |
[2024-2 Java 스터디] 강보경 #4주차 (2) | 2024.11.07 |