반응형
해당 강의를 보고 정리한 것입니다.
https://programmers.co.kr/learn/courses/5
객체지향이란?
: 객체들이 상호작용 하도록 프로그래밍하는 것
-객체 : 프로그램을 구성하는 요소
클래스
: 객체를 만들기 위한 틀
예) 객체 - 붕어빵 // 클래스 - 붕어빵 틀
- 생성 방법
public class 클래스명 { 클래스 내용 }
- 객체 생성하기
- new 연산자는 new연산자 뒤에 나오는 생성자를 이용해 메모리에 객체를 생성하라는 명령public class CarExam { public static void main(String[] args) { Car c1 = new Car(); Car c2 = new Car(); } }
- 메모리에 만들어진 객체 : 인스턴스(instance)
- 해당 코드에선 Car 객체 2개 생성되고 각각 개체를 c1, c2변수가 참조되도록 선언
참조 타입
: 참조형 타입은 기본형 타입을 제외한 모든 타입 (배열, 클래스 등)
public class ReferenceDataType {
public static void main(String[] args) {
int i = 4; // 기본형 타입
String str = new String("Hello");
}
}
- 메모리에 올라간 인스턴스를 가리키는 변수, 참조하는 변수, 레퍼런스 하는 변수가 str
(참조한다, 레퍼런스 한다 = 변수가 인스턴스를 가지고 있는 게 아닌 "참조"한다. 즉, 말 그대로 가리킨다의 의미.) - str 변수에 메모리의 주소 값이 저장되는 것. but 어떤 메모리에 저장되는지 그 정보를 알 수 있는 방법은 없다.
그렇기 때문에 str 변수는 String 인스턴스를 참조한다라고만 알아 두자. - 클래스들은 모두 참조형이다.
- 메모리상에서의 참조 변수
필드(field) 선언
: 해당 클래스가 가지고 있는 것(속성)
자동차는 자동차 이름, 자동차 번호를 가지고 있고, 자동차는 달리고 멈추는 기능이 있음.
- 이름과 번호를 필드로 가지고 있는 Car클래스 선언
public class Car { String name; int number;
- Car 클래스 인스턴스화 하기
public class CarExam { public static void main(String[] args) { Car c1 = new Car(); Car c2 = new Car(); } }
- 속성 이용하기
- 참조 변수 다음에 나오는 점(dot)은 참조 변수가 참조하는 객체가 가지고 있는 것을 사용
public class CarExam { public static void main(String[] args) { Car c1 = new Car(); Car c2 = new Car(); //c1.name은 c1이 참조하는 객체의 name 을 의미. c1.name = "소방차"; //c1이 참조하는 객체의 name을 소방차로 설정 c1.number = 1234; // c1.number = 1234란 c1이 참조하는 객체의 number를 1234 로 설정 c2.name = "구급차"; //c2가 가리키는 객체의name을 구급차로 설정 c2.number = 1004; //c2가 가리키는 객체의 number를 1004로 설정 System.out.println(c1.name); //콘솔에 c1이 참조하는 객체의 name 을 출력합니다. System.out.println(c1.number); //콘솔에 c1이 참조하는 객체의 number 를 출력합니다. String name = c2.name; //c2가 참조하는 객체의 name 을 String 타입 변수 name 도 참조하게 합니다. } }
메서드
: 클래스가 가지고 있는 기능. 클래스 안에 선언됨
필드가 물체의 상태라면, 물체의 행동에 해당.
car에 이름과 번호가 있기도 하지만, car는 앞으로 전진할 수도 있고 후진하는 행동도 할 수 있다.
- 메서드는 입력값이 있고, 그 입력값을 받아서 무언가 한 다음 결과를 도출해 내는 수학의 함수와 비슷
- 입력값을 매개변수라고 하고, 결과 값을 리턴 값이라고 함.
- 인자(argument) : 함수 호출 시 전달되는 값
- 매개 변수(parameter) : 전달된 인자를 받아들이는 변수
메서드 선언
- 매개변수도 없고 리턴하는 것도 없는 형태
- 리턴하는 것이 없을 경우(void)
public void method1() { System.out.println("method1이 실행"); }
- 정수를 받아들인 후 리턴하지 않는 메서드
- 받아들이는 값은 어떤 타입이라도 상관없다.
- 받아들이는 값의 수는 여러 개 일 수 있다. 여러 개일 경우 콤마(,)로 구분한다.
public void method2(int x, int y) { System.out.println(x + " + " + y + " = " + x+y); }
- 아무것도 받아들이지 않고, 정수를 반환하는 메서드
- 리턴하는 값 앞에 return이라는 키워드를 사용
- 메서드 이름 앞에는 리턴하는 타입
- 리턴 타입은 하나만 사용 가능. (어떤 타입이라도 상관없음)
public int method3() { System.out.println("method3"); return 10; }
- 정수 2개 매개변수, 아무것도 반환하지 않는 메서드
메서드 "," + y +"를 이용하는 method4"); }
- 정수 한 개 받아들인 후, 정수를 반환하는 메서드
public int method5(int x) { System.out.println(x + "를 이용하는 method5"); return 5; }
- 사용
MyClass 클래스
public class MyClass { public void method1() { System.out.println("method1이 실행"); } public void method2(int x) { System.out.println(x + "를 이용하는 method2"); } public int method3() { System.out.println("method3"); return 10; } public void method4(int x, int y) { System.out.println(x + "," + y +"를 이용하는 method4"); } public int method5(int x) { System.out.println(x + "를 이용하는 method5"); return 5; } }
메서드 사용하기
- 메서드가 정의된 클래스 MyClass가 생성돼야 함
- 객체 생성 시 new연산자 사용
- 생성된 클래스를 참조하는 레퍼런스 변수. 메서드명()으로
>>public class MyClassExam{ public static void main(String[] args) { MyClass c1 = new MyClass(); c1.method1(); c1.method2(3); int x = c1.method3(); System.out.println("method3의 리턴값 : " + x); c1.method4(5, 7); int y = c1.method5(9); System.out.println("method4의 리턴값 : " + y); } }
method1이 실행
3를 이용하는 method2
method3
method3의 리턴값 : 10
5,7를 이용하는 method4
9를 이용하는 method5
method4의 리턴값 : 5
메서드 호출에서의 참조 타입과 기본형 타입의 차이
public class ReferenceDataType {
public void addOne(int x) {
x++;
}
public void addOne(int[] arr) {
for(int i=0; i<arr.length;i++) {
arr[i]++;
}
}
public static void main(String[] args) {
ReferenceDataType exam = new ReferenceDataType();
int value = 10;
int[] arr = {10};
exam.addOne(value);
exam.addOne(arr);
System.out.println(value);
System.out.println(arr[0]);
}
}
- addOne 메서드 : 전달받은 값을 +1 더해주는 메소드
- value의 경우 : value를 addOne의 매개변수로 넣어주면 addOne 메소드 내부에서 value와 같은 값의 x라는 새로운 인스턴스를 생성해서 사용함.
즉, value와 addOne내부의 x는 다른 인스턴스이기 때문에 x를 변화시켜도 value는 변화하지 않음. - arr의 경우 : arr는 참조값(배열의 주소 값)이므로 매개변수로 arr를 주어도 addOne 내부의 argArr 또한 같은 배열을 인스턴스로 사용함.
즉, arr와 addOne내부의 argArr는 같은 인스턴스이기 때문에 argArr의 값이 변화 시 arr값도 변화함.
반응형
'Language > Java' 카테고리의 다른 글
자바 입문하기10 - scope, static, enum (0) | 2022.01.10 |
---|---|
자바 입문하기9 - String (0) | 2022.01.10 |
자바 입문하기7 - for each (0) | 2022.01.07 |
자바 입문하기6 - 이차원 배열 (0) | 2022.01.07 |
자바 입문하기5 - 배열 (0) | 2022.01.07 |