랩터
4/11 객체지향이론, 기본개념 본문
OOP: 프로그래밍에서 필요한 데이터를 한 데 모아 추상화시켜 상태와 행위를 가진 객체를 만들고 그 객체들 간의 협력과 유기적인 상호작용을 통해 특정 기능을 구성
객체지향 프로그래밍은 실제 사물의 속성(state)과 기능(behavior)을 분석한 후에 이것을 프로그래밍의 변수와 함수로 정의함으로 실제 세계를 최대한 컴퓨터 프로그래밍에 반영하고자 하는 시도라 설명할 수 있다.
프로그램 개발 및 유지 보수에 드는 비용과 시간을 획기적으로 줄일 수 있고, 객체를 통해 데이터를 관리하여 데이터를 손실 없이 관리하기에 용이하다. => 생산성 향상
개념을 기록을 통해 꼼꼼히 잘 다져보자. 하루에 한번씩. 미루지 말고.
클래스
클래스와 객체
객체가 우리가 인지할 수 있는 ‘실재하는 모든 것’이자 ‘사용할 수 있는 실체'를 의미합니다.
클래스(Class)란 이러한 객체를 정의한 '설계도(blueprint)' 또는 '틀(frame)’이라 정의할 수 있습니다.
위 집들은 같지 않고 각각 다 다릅니다. 집의 예시에서 각각의 집은 일반적인 의미에서 객체이고, 조금 더 구체적인 표현으로 집의 설계도로부터 만들어진 집이라는 의미에서 집 클래스의 인스턴스라고 할 수 있습니다.
클래스를 통해 생성된 객체를 우리는 해당 클래스의 인스턴스(instance)라 부릅니다. 또한 클래스로부터 객체를 만드는 과정을 우리는 인스턴스화(instantiate)라 지칭합니다. 객체라는건 클래스를 토대로 만들어집니다.
클래스의 구성요소와 기본 문법
public class ExampleClass {
int x = 10; // (1)필드
void printX() {...} // (2)메서드
ExampleClass {...} // (3)생성자
class ExampleClass2 {...} // (4)이너 클래스
}
(1) 필드 - 클래스의 속성을 나타내는 변수입니다. 자동차로 예를 들면 모델명, 컬러, 바퀴의 수 등이 포함될 수 있습니다.
(2) 메서드 - 클래스의 기능을 나타내는 함수입니다. 자동차를 예로 들면 시동하기, 가속하기, 정지하기 등이 포함될 수 있습니다.
(3) 생성자 - 클래스의 객체를 생성하는 역할을 합니다. 뒤의 내용에서 좀 더 자세히 학습하도록 합니다.
(4) 이너 클래스 - 클래스 내부의 클래스를 의미합니다.
필드와 메서드는 각각의 클래스가 가지는 속성(state)과 기능(behavior)을 대표합니다. 속성과 기능은 해당 클래스와 관련된 데이터의 집합이며, 핵심적인 정보를 담고 있다고 할 수 있습니다.
import java.util.Scanner;
public class SimpleCalculatorTest {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in); // 외부 입력을 받을 수 있는 Scanner 객체 생성
//new = 인스턴스화 하는것 Scanner라는 클래스를.
System.out.println("첫 번째 숫자를 입력하세요.");
String str1 = scan.nextLine(); // 첫 번째 숫자 입력
System.out.println("사칙연산자를 입력하세요.");
String op = scan.nextLine(); // 사칙연산자 입력
System.out.println("두 번째 숫자를 입력하세요.");
String str2 = scan.nextLine(); // 두 번째 숫자 입력
int num1 = Integer.parseInt(str1); // 입력받은 첫 번째 문자를 숫자형으로 변환
int num2 = Integer.parseInt(str2); // 입력받은 두 번째 문자를 숫자형으로 변환
int result;
if(op.equals("+")) { // 덧셈 연산
result = num1 + num2;
}
else if(op.equals("-")) { //뺄셈 연산
result = num1 - num2;
}
else if(op.equals("/")) { //나누기 연산
result = num1 / num2;
}
else{
result = num1 * num2; //곱하기 연산
}
System.out.println(str1 + " " + op + " " + str2 + " = " + result); // 결과값 출력
}
}
()가 붙는건 전부다 메서드이다.
객체
객체(Object)
객체는 크게 속성과 기능이라는 두 가지 구성요소로 이뤄져 있습니다.
속성과 기능은 각각 필드와 메서드로 정의되는데, 일반적으로 하나의 객체는 다양한 속성과 기능의 집합으로 이뤄져 있습니다. 그리고 이러한 속성과 기능은 이너클래스와 함께 객체의 **멤버(member)**라 부릅니다.
객체의 생성은 다음과 같이 new 키워드를 사용하여 다음과 같이 실제 객체를 생성할 수 있습니다. 그리고 객체를 생성한 후에는 포인트 연산자(.)를 통해 해당 객체의 멤버에 접근이 가능합니다.
필드
필드(Field)
필드는 ‘클래스에 포함된 변수'를 의미하는 것으로 객체의 속성을 정의할 때 사용됩니다.
자바에서 변수는 크게 클래스 변수(cv, class variable), 인스턴스 변수(iv, instance variable), 그리고 **지역 변수(lv, local variable)**라는 세 가지로 구분될 수 있습니다.
이 중 우리가 필드라 부른 것은 클래스 변수와 인스턴스 변수이며, 이 둘은 다시 static 키워드의 유무로 구분할 수 있습니다.
좀 더 구체적으로, static 키워드가 함께 선언된 것은 클래스 변수, 그렇지 않은 것은 인스턴스 변수입니다. 그리고 이 두 가지 변수 유형에 포함되지 않고 메서드 내에 포함된 모든 변수를 지역변수라 부릅니다.
static이 붙고 안붙고 기능과 성능의 차이가 어떤게 있는지?
:
class Example { // => 클래스 영역
int instanceVariable; // 인스턴스 변수
static int classVariable; // 클래스 변수(static 변수, 공유변수)
static int final classVariable; // 클래스 변수(static 변수, 공유변수)
//클래스 변수에는 final을 거의 무조건 써줘야한다. 선언과 동시에 할당도 해줘야함
void method() { // => 메서드 영역
int localVariable = 0; // 지역 변수. {}블록 안에서만 유효
}
}
클래스 변수를 많이 쓰는건 지양해야한다. (static을 최대한 피해야한다.)
클래스 변수는 클래스에 지정되있기 때문에 보통 상수로 많이쓴다.
클래스 변수는 인스턴스 변수와 달리 인스턴스를 따로 생성하지 않고도 언제라도 클래스명.클래스변수명 을 통해 사용이 가능.
static이 붙은 메서드는 static이 붙은 변수만 쓸수 있고
static이 붙지 않은 매서드는 static붙든 안붙든 상관없이 어떤 변수든 다 쓸 수 있다.
메서드
메서드(Method)
메서드는 “특정 작업을 수행하는 일련의 명령문들의 집합"을 의미하며, 앞서 본 것처럼 클래스의 기능에 해당하는 내용들을 담당합니다. 앞의 자동차의 예시에서 시동걸기, 가속하기, 정지 등이 메서드로 정의되었습니다.
Double multiply(int x, double y) { // 매개변수가 있는 메서드 //Double: 실수,null를 담을 수 있는 레퍼런스
double result = x * y;
return result;
}
메서드 오버로딩(Method Overloading)
메서드 오버로딩이란 하나의 클래스 안에 같은 이름의 메서드를 여러 개 정의하는 것을 의미합니다. 영어로 “overload”의 사전적 의미가 ‘과적하다/ 부담을 지우다’라는 점을 생각해 보면 좀 더 이해하기 쉽습니다.
public class Overloading {
public static void main(String[] args) {
Shape s = new Shape(); // 객체 생성
s.area(); // 메서드 호출
s.area(5);
s.area(10,10);
s.area(6.0, 12.0);
}
}
class Shape {
public void area() { // 메서드 오버로딩. 같은 이름의 메서드 4개.
System.out.println("넓이");
}
public void area(int r) {
System.out.println("원 넓이 = " + 3.14 * r * r);
}
public void area(int w, int l) {
System.out.println("직사각형 넓이 = " + w * l);
}
public void area(double b, double h) {
System.out.println("삼각형 넓이 = " + 0.5 * b * h);
}
}
//출력값
넓이
원 넓이 = 78.5
직사각형 넓이 = 100
삼각형 넓이 = 36.0
- 메서드를 오버로딩하려면
- 메서드의 이름이 같아야 합니다.
- 매개변수의 개수 또는 타입이 달라야 합니다.
오버로딩의 장점은 가장 큰 장점은 하나의 메서드로 여러 경우의 수를 해결할 수 있다는 것입니다.
생성자(Constructor)
생성자는 말 그대로 객체를 생성하는 역할을 하는 클래스의 구성 요소로서, 인스턴스가 생성될 때 호출되는 인스턴스 초기화 메서드라 정리할 수 있습니다.
생성자는 인스턴스 변수들을 초기화하는 데 사용되는 특수한 메서드라 할 수 있습니다.
생성자는 메서드와 비슷한 구조를 가지고 있지만 크게 두 가지 부분에서 큰 차이를 가집니다.
첫 번째는 생성자의 이름은 반드시 클래스의 이름과 같아야 합니다. 만약 클래스 이름과 생성자의 이름이 다르다면 그 메서드는 더 이상 생성자로서의 기능을 수행할 수 없습니다.
두 번째로, 생성자는 리턴 타입이 없습니다. 하지만 메서드에서 리턴 값이 없을 때 표시하는 void 키워드를 사용하지 않습니다. 그 이유는 무언가를 ‘리턴하지 않는다’를 의미하는 void와는 다르게 생성자는 아예 리턴 타입 자체가 존재하지 않기 때문입니다.
this가 하는 역할: 현재 내가 가리키는 클래스
'공부 > JAVA' 카테고리의 다른 글
[Java] 패키지,접근 제어자 (0) | 2024.04.16 |
---|---|
[Java] 캡슐화 (0) | 2024.04.16 |
4/8 배열 (0) | 2024.04.08 |
[반복문]연습문제 (0) | 2024.04.05 |
[Java] 반복문 (0) | 2024.04.05 |