27강. 객체지향 프로그래밍
28강. 자바 필드
29강. 자바 생성자(1) 기본 생성자, 생성자 선언, 필드 초기화
30강. 자바 생성자(2) 생성자 오버로딩, 다른 생성자 호출 : this()
31강. 자바 메서드(1) 메서드 선언
32강. 자바 메서드(2) 메서드 선언, return문
33강. 자바 메서드(3) 메서드 호출, 메서드 오버로딩
27강. 객체지향 프로그래밍
ㅁ 객체(Object)
- 물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신의 속성을 가지며 식별 가능한 것.
- 속성(필드)과 동작(method)으로 구성.
- 현실 세계의 객체를 SW인 자바로 설계하는 것을 객체 모델링이라고 함.
- 객체 모델링(Object Modeling)은 소프트웨어 개발 과정에서 현실 세계의 개체와 그들 간의 관계를 추상화하여 소프트웨어 시스템의 구조를 설계하는 방법론입니다. 이 과정에서 개체는 객체(Object)로 표현되고, 이 객체들은 데이터와 동작을 포함합니다.
ㅁ 객체와 객체 간의 상호작용
- 메서드를 통해 객체들이 상호작용.
- 메서드 호출: 객체가 다른 객체의 기능을 이용하는 것.
ㅁ 객체 간의 관계
- 집합 관계: 부품과 완성품의 관계
- 사용 관계: 객체 간의 상호작용
- 상속 관계: 상위(부모) 객체를 기반으로 하위(자식) 객체를 생성
ㅁ 객체 지향 프로그래밍
- 집합/사용 관계에 있는 객체를 하나씩 설계한 후 조립하여 프로그램 개발
- 객체 지향 프로그래밍(Object-Oriented Programming, OOP)은 소프트웨어 개발 패러다임 중 하나로, 프로그램을 객체(Objects)들의 상호작용으로 구성하는 방식입니다. 객체는 데이터(속성)와 해당 데이터에 작용하는 동작(메서드)을 포함합니다.
ㅁ 클래스(class)
- 자바에서 설계도를 말함.
- 인스턴스(Instance): 클래스로부터 만들어진 객체
- 인스턴스화: 클래스로부터 객체를 만드는 과정
- 객체지향 프로그래밍 단계: 클래스 설계 -> 설계된 클래스로 사용할 객체 생성 -> 객체 이용
ㅁ 클래스 선언
(1) 객체 구상 후 클래스 이름을 결정
※ 식별자 작성 규칙
- 하나 이상의 문자로 이루어질 것.
- 첫 글자에는 숫자가 올 수 없다.
- 자바 키워드는 사용할 수 없다.
- $, _ 외의 특수문자는 사용할 수 없다.
(2) 결정한 클래스 이름으로 소스 파일 생성
- 클래스 이름.java
(3) 소스 파일에 아래와 같이 작성
public class 클래스이름 {
}
ㅁ 클래스로부터 객체를 생성
- new 클래스();
- new 연산자로 메모리 힙 영역에 객체 생성. // new 연산자는 객체 생성 연산자. 배열도 객체고 String도 클래스다.
- 객체 생성 후 객체 번지가 리턴됨.
- 클래스 변수에 저장하여 변수를 통해 객체 사용이 가능하다.
클래스 변수;
변수 = new 클래스();
클래스 변수 = new 클래스();
- 클래스 변수는 어떻게 만드냐면,
객체를 만들 때 이 클래스를 가지고 만들었기 때문에,
이 객체의 번지를 저장할 수 있는 변수도,
해당 클래스의 변수로 선언이 되어야 함.
- 클래스 변수: 클래스로 선언한 변수이며 해당 클래스의 객체 번지가 저장됨.
ㅁ 클래스의 두 용도
- (1) 라이브러리(API: Application Program Interface) 클래스: 객체 생성 및 메서드 제공 역할
- (2) 실행 클래스: main()메서드 제공 역할
(1)
public class Student{ }
(2)
public class StudentExample{
public static void main(String[] args){
Student s1 = new Student();
Student s2 = new Student();
}
}
- 라이브러리는 특정 기능을 수행하는 코드의 집합입니다. 라이브러리는 재사용 가능한 코드 모듈을 제공하여 개발자가 반복적으로 사용할 수 있도록 합니다. 라이브러리를 사용하면 이미 검증된 코드를 재사용할 수 있어, 코드 작성 시간을 절약하고 오류를 줄일 수 있습니다.
- API는 소프트웨어 구성 요소들이 상호 작용할 수 있도록 정의된 명세서(인터페이스)입니다. API는 라이브러리, 프레임워크, 운영 체제, 웹 서비스 등과 상호작용하기 위한 방법을 제공합니다. API는 함수, 클래스, 메서드, 프로토콜 등의 집합으로 이루어져 있으며, 개발자가 특정 기능을 수행하기 위해 호출할 수 있는 명령어를 정의합니다.
- API는 응용프로그램 간에 소통을 하기 위한 프로그램입니다.
- API는 다른 프로그램이나 시스템에서 이용할 수 있도록 제공되는 인터페이스입니다.
- 모듈은 프로그램에서 하나의 기능을 수행하는 코드의 집합.
ㅁ 라이브러리와 프레임워크의 공통점과 차이점
- 공통점은 바로 둘다 코드의 모음이자 집합체라는 것이다
- 프레임워크는 라이브러리를 포함한 코드의 집합이고, 간단하게 생각하면 "라이브러리들의 모음"이며, 프레임워크는 라이브러리 보다 더 상위의 큰 개념이라고 생각하면 된다.
- 무엇보다 라이브러리와 프레임워크의 가장 큰 차이점은 제어 흐름에 대한 책임의 차이가 있다.
라이브러리는 개발자가 코드를 작성하는 데 필요한 도구를 제공한다. 개발자는 라이브러리를 호출하여 필요한 코드를 가져올 수 있지만, 제어 흐름은 개발자가 제어한다.
반면에, 프레임워크는 개발자가 작성하는 코드를 프레임워크가 제어한다. 코드는 개발자가 짜고 제어하여 원하는 위치에서 원하는 동작이 할 수 있도록 작성하는데, 결과적으로 프레임워크는 개발자가 작성한 코드를 가져와 실행한다. 이러한 현상을 제어의 역전(IoC)이라고 부른다. 이는 프레임워크가 프로그램의 아키텍처를 강제하면서 개발자가 작성하는 코드를 더 일관성 있게 만들어 준다.
ㅁ 클래스 멤버
- 클래스를 선언하고 클래스의 내용으로 클래스 멤버를 작성한다. // 클래스 중괄호 내에서 선언되는 것들.
- 필드(field): 객체의 데이터가 저장되는 곳. // 클래스 수준에서 선언된 변수.
- 생성자(constructor): 객체 생성 시 초기화 역할 담당.
- 메서드(method): 객체의 동작에 해당하는 실행 블록.
28강. 필드
ㅁ 필드
- 객체의 고유 데이터, 객체가 가져야할 부품, 객체의 현재 상태 정보(데이터)를 저장.
- 고유 데이터(제작 회사, 모델, 색깔, 최고 속도)
- 부품(차체, 엔진, 타이어) // Tire 클래스로 선언된 변수 tire;
- 상태 데이터(현재 속도, 엔진 회전 수)
ㅁ 필드 선언
- 클래스 중괄호 블록 어디서든 존재(선언) 가능.
- 생성자와 메서드 중괄호 블록 내부에는 선언 불가.
- 변수와 선언 형태 유사하나 변수가 아님에 주의.
※ 필드(field)와 변수(variable)
- 자바에서 "필드"와 "변수"는 서로 관련이 있지만, 같은 것을 의미하지는 않습니다.
- 변수는 값을 저장하기 위한 메모리 공간을 의미하며, 프로그램 실행 중에 값을 변경할 수 있습니다.
변수는 선언된 위치와 사용되는 범위에 따라 아래와 같이 분류됩니다.
지역 변수(Local Variable): 메서드 내에서 선언되며, 메서드가 실행될 때 생성되고 메서드가 종료되면 소멸됩니다.
매개 변수(Parameter): 메서드 선언부에 정의된 변수로, 메서드가 호출될 때 전달된 인수를 받습니다.
- 필드는 클래스 수준에서 선언된 변수로, 객체의 속성을 정의합니다.
필드는 클래스의 인스턴스가 생성될 때 메모리에 할당되며, 객체가 소멸될 때까지 존재합니다.
필드는 클래스 내부에 선언되며, 클래스의 인스턴스 변수라고도 불립니다.
인스턴스 변수(Instance Variable): 클래스의 인스턴스에 속하며, 객체마다 고유한 값을 가집니다.
클래스 변수(Class Variable): static 키워드로 선언된 변수로, 클래스의 모든 인스턴스가 공유하는 값을 가집니다.
ㅁ 같은 패키지에 속하는 클래스를 두 개 만들어서, 하나는 필드만, 하나는 main 메서드를 만들어서 다른 클래스를 이용.
- 클래스 내부의 생성자와 메서드에서는 바로 필드 사용이 가능하지만,
- 클래스 외부에서 필드를 사용하는 경우에는 클래스로부터 객체를 생성한 뒤 필드 사용이 가능하다.
- 필드는 객체의 데이터기 때문에 객체 없이는 필드도 없다.
29강. 자바 생성자(1) 기본 생성자, 생성자 선언, 필드 초기화
ㅁ 생성자(Constructor)
- 생정자는 new 연산자로 호출되는 중괄호 블록이다.
- 객체 생성 시 초기화를 담당한다.
Car myCar = new Car(); // 생성자 호출 코드
- 클래스로부터 new 연산자로 객체를 생성할 때 호출되어 객체의 초기화를 담당한다.
- 생성자는 객체가 생성될 때 호출되어 초기화를 수행하는 특수한 메서드입니다.
ㅁ 기본 생성자
- 클래스 내부에 생성자 선언을 생략할 경우 바이트 코드(.class 파일)에 자동으로 추가됨.
[public] 클래스이름() { }
- 클래스를 선언할 때 public class 클래스 { }로 선언하면 컴파일러가 기본 생성자를 추가할 때 public 붙임.
- 클래스에 생성자를 선언하지 않아도 new 생성자()로 객체 생성 가능한 이유가 기본 생성자가 자동으로 추가가 되었기 때문이다.
- 소스파일 Car.java - > 바이트 코드 파일 Car.class
public class Car { } (컴파일) public class Car { public Car() { } }
ㅁ 생성자 선언
- 클래스에 생성자가 명시적으로 선언되었을 경우 반드시 선언된 생성자를 호출하여 객체를 생성하여야 한다.
(매개변수가 3개인 경우, 반드시 매개변수 3개를 다 전달해야 함.)
- 명시적으로 선언된 생성자가 있을 경우 기본 생성자가 제공되지 않아서 myCar()처럼 호출할 수 없다.
ㅁ 생성자를 통한 필드 초기화
- 필드와 매개 변수 이름이 동일할 경우, 'this.필드'로 표현
- this는 이 객체를 가리킴.
public class Korean {
String name;
String ssn;
Korean(String name, String ssn) {
this.name = name;
this.ssn = ssn;
}
}
30강. 자바 생성자(2) 생성자 오버로딩, 다른 생성자 호출 : this()
ㅁ 생성자 오버로딩
- 메서드 오버로딩: 메서드 명은 같으나 매개변수의 개수와 자료형이 다른 경우 // + 순서
- 매개 변수를 달리하는 생성자를 여러 개 선언하는 것을 말함.
- 외부에서 제공되는 다양한 데이터를 사용하여 객체를 초기화하려면 생성자 역시 다양해야 함.
- 매개 변수의 타입, 개수, 선언된 순서가 같은 경우에, 매개 변수 이름만 바꾸는 것은 생성자 오버로딩이 아님.
Car(String model, String color) { ... }
Car(String color, String model) { ... } // 이 생성자 추가시 컴파일 에러 발생.
ㅁ 다른 생성자 호출: this()
- 생성자를 오버로딩을 할 경우에 생성자 초기화 내용이 비슷하면, 오버로딩된 생성자 내용이 많이 중복될 수 있다.
이런 경우에 좀 더 효율적으로 중복을 제거해서 생성자를 오버로딩.
※ this() 코드
- this() 코드는 자신의 또 다른 생성자를 호출하는 코드이다.
- 생성자에서 다른 생성자를 호출
- 필드 초기화 내용을 하나의 생성자에만 집중 작성하고 나머지 생성자는 초기화 내용을 가진 생성자로 호출.
생성자 오버로딩 증가 시 중복 코드 발생 문제 해결.
- 다른 생성자를 호출하는 this() 코드는 생성자 첫 줄에서만 허용
클래스( [매개변수, ...] ) {
this( 매개값, ..., 값, ... ); // 매개 값에 따라 클래스의 다른 생성자 호출
실행문;
}
- 'this.변수'로 쓰일 때는 현재 객체를 말하고, 'this()'는 클래스 내의 다른 생성자를 호출하는데 사용.
31강. 자바 메서드(1) 메서드 선언
ㅁ 메서드 선언부(signature)
- 리턴 타입: 메서드가 리턴하는 결과의 타입 표시
- 매개 값을 받기 위한 매개 변수 선언. 매개 변수는 없을 수도 있고 여러 개 있을 수도 있음.
ㅁ 리턴 타입
- 메서드를 실행한 후의 결과값( =반환값, return값)의 타입.
- 결과값이 없다면 void로 선언.
- 리턴값이 있다면 리턴 타입이 선언부에 명시.
ㅁ 메서드 이름
- 숫자로 시작해선 안 되고, $와 _를 제외한 특수문자 사용 불가
- 메서드 이름은 관례적으로 소문자로 작성
- 서로 다른 단어가 혼합된 이름일 경우 뒤이어 오는 단어의 첫 글자를 대문자로 작성.
32강. 자바 메서드(2) 메서드 선언, return문
ㅁ 매개 변수의 개수를 모를 경우
(1) 매개 변수를 배열 타입으로 선언할 수 있다.
int sum1(int[] values) { }
- sum1이라는 메서드를 선언하는데 몇 개의 매개값이 올 지 모른다면 배열로 선언할 수 있다.
int[] array = { 1, 2, 3 };
int result = sum1(array); // 배열 객체를 만들고 매개 값으로 제공하거나
int result = sum1(new int[] { 1, 2, 3, 4, 5 }); // sum1을 호출할 때 배열 객체를 만들거나
(2) 배열을 생성하지 않고 값의 목록만 넘겨주는 방식으로 선언할 수도 있다.
int sum2(int ... values) { } // 온점 3개
int result = sum2(1, 2, 3);
int result = sum2(1, 2, 3, 4, 5);
- 가변인자를 사용할 때는 가변인자는 매개변수 중에서 제일 마지막에 선언해야 한다.
String varargsEx(String mail, String... str) { }
String varargsEx(String... str, String mail) { } // 컴파일 에러
- 자바는 이 변수를 배열 타입 변수로 간주함.
그래서 int sum2(int ... values) { } 메서드를 만들고, (1) 처럼 배열의 주소값을 줘도 동작함.
- Java에서 가변 인자(Varargs)는 내부적으로 배열로 처리됩니다. 따라서, 가변 인자를 사용하는 메서드에 배열을 전달해도 동작합니다. 이는 int... values와 int[] values가 동일한 방식으로 처리된다는 의미입니다.
어떤식으로 선언하든 자바는 내부적으로 sum1을 배열 객체로 처리함.
※ Java에서 배열을 선언하고 초기화하는 방법
(1) 배열 선언 후 나중에 초기화
int[] array; // 배열 선언
array = new int[5]; // 배열 초기화 (크기 5)
-이 방법은 배열을 먼저 선언하고, 나중에 배열의 크기를 지정하여 초기화합니다.
(2) 배열 선언과 동시에 크기를 지정하여 초기화
int[] array = new int[5]; // 배열 선언과 초기화 (크기 5)
- 이 방법은 배열을 선언하면서 동시에 배열의 크기를 지정하여 초기화합니다.
(3) 배열 선언과 동시에 초기값을 지정하여 초기화
int[] array = {1, 2, 3, 4, 5}; // 배열 선언과 초기화 (초기값 1, 2, 3, 4, 5)
- 이 방법은 배열을 선언하면서 동시에 초기값을 지정하여 초기화합니다.
(4) 배열 선언 후, 초기값을 지정하여 초기화
int[] array;
array = new int[] {1, 2, 3, 4, 5}; // 배열 선언 후 초기화 (초기값 1, 2, 3, 4, 5)
- 이 방법은 배열을 선언한 후, 초기값을 지정하여 초기화합니다. 주로 배열의 크기를 직접 명시하지 않고 초기값을 지정할 때 사용됩니다.
(5) 다차원 배열 선언과 초기화 2차원 배열 선언과 초기화
int[][] array = new int[3][4]; // 2차원 배열 선언과 초기화 (3x4 배열) 2차원 배열 선언 후, 초기값을 지정하여 초기화
int[][] array = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }; // 2차원 배열 선언과 초기화 (초기값 지정)
ㅁ return문
- return문의 리턴값은 리턴타입이거나, 리턴타입으로 변환될 수 있어야 함.
int plus(int x, int y) {
byte result = (byte) (x + y);
return result;
}
- return 키워드는 메서드의 실행을 중지하고 호출자에게 값을 반환함.
return 아래에 실행문을 더 쓰는 것은 의미가 없음.
- 리턴값이 없는 메서드(void)여도 return;을 써서 메서드 실행을 종료할 수 있음.
이때 return;은 결과값을 반환하는 게 아니라 메서드 실행을 종료하는 역할.
33강. 자바 메서드(3) 메서드 호출, 메서드 오버로딩
ㅁ 메서드가 반환값을 가지지만 호출하는 쪽에서 그 값을 사용하지 않고 무시하고자 한다면, 메서드를 호출하는 구문만을 사용할 수 있습니다.
public class Example {
public int add(int a, int b) { return a + b; }
public static void main(String[] args) {
Example example = new Example();
example.add(2, 3); // 반환값을 받지 않고 메서드 호출
}
}
public class ClassName {
void method1( String a, int b ) { }
void method2() {
method1( "가나다", 100); // 같은 클래스이므로 그냥 method1 이름만으로 호출.
}
}
public class Calculator {
static int plus(int a, int b) {
int result = a + b;
return result;
}
public static void main(String[] args) {
plus(3, 5);
}
}
- 자바에서 메서드는 클래스 내에서 선언되어야 함. 메서드 안에 또 메서드를 선언할 수 없다.
- 단, 메서드에 반환형이 있으면 그 메서드 안에 return 문이 필요함.
- 호출할 때 반환값이 있어도 받지 않고 그냥 호출만 할 수 있다.
- 객체 외부에서 호출할 때도 마찬가지로 반환값을 받지 않고 호출만 할 수 있다.
ㅁ 메서드 오버로딩
- 리턴 타입은 상관이 없음.
- 메서드 명은 같으나 매개 변수의 타입, 개수, 순서 중 하나가 달라야 한다.
- 매개 변수의 이름도 상관이 없음.
int plus(int x, int y) {
int result = x + y;
return result;
}
double plus(double x, double y) {
double result = x + y;
return result;
}
int x = 10;
double y = 20.3;
plus(x, y);
- plus(double x, double y)가 실행됨. // 이클립스서 x
- (int x, double y)인 메서드가 있으면 그걸 실행. 없어도 타입 변환이 가능한 메서드로.
ㅁ println() 메서드 오버로딩
'혼자 공부하는 자바' 카테고리의 다른 글
혼자 공부하는 자바 (40강 ~ 45강) (0) | 2024.05.31 |
---|---|
혼자 공부하는 자바 (34강 ~ 39강) (0) | 2024.05.29 |
혼자 공부하는 자바 (20강 ~ 26강) (0) | 2024.05.26 |
혼자 공부하는 자바 (13강 ~ 19강) (0) | 2024.05.24 |
혼자 공부하는 자바 (7강 ~ 12강) (0) | 2024.05.23 |