💬 3일차 후기: 국비지원 프로그래밍 교육 커리큘럼 빡세다는 이야기 많이 들었지만 TIL을 새벽 3시에 쓰고 있게 될 줄이야.......🤔 바빠도 예습, 복습을 잊지말고 하자...🔥
🔅 객체 지향 프로그래밍의 핵심은 은닉
+ 상속
+ 다형성
🔅
학부 때부터 객체 지향 프로그래밍
이라는 말을 정말 많이 들었는데, (맨날 딸려나오는 붕어빵 비유..) 들어도 들어도 익숙해지지 않는 개념이었다. 알겠는데 모르겠달까..;;;🐟🐟🐟
여담으로, 프로그래밍에 가장 관심을 갖게된 계기가 데이터베이스 설계
수업을 들으면서부터인데
이번에 객체 지향 프로그래밍 개념을 다시 배우면서, 데이터 모델링 과정
이 떠올랐다.
현실 세계의 코끼리를 컴퓨터 세계의 데이터 베이스로 옮기려면?
코끼리 : 발의 개수, 코의 길이, 몸무게, ...
데이터베이스를 설계할 때 개념을 추상화하고, 개념 간의 관계를 정의하는 것이 객체 지향 프로그래밍의 개념과 유사한 것이다..!
💡 객체 지향 프로그래밍
: 현실 세계의 객체를 컴퓨터 세계로 옮기기 위해,
객체를 정의하고, 객체 간 협력을 프로그래밍하는 것
객체 지향 프로그래밍은 현실 세계의 객체 하나 하나를 클래스
로 프로그래밍한다.
클래스는 객체의 속성
과 기능
을 코드로 구현한 것이다.
=> 클래스를 정의한다.
클래스
: 학생
속성
: 학번, 이름, 학년, 주소,... => 멤버 변수
기능
: 이름을 말하다, 학교를 가다, 버스를 타다,... => 메서드(멤버 함수)
🔽 위에서 예로 든 학생 클래스 정의(메서드 없는 클래스)
public class Student { // 클래스 이름은 대문자로 시작
int studentID; // 멤버 변수
String studentName;
int grade;
String address;
public static void main(String[] args) {
Student student = new Student(); // student 생성
// Student()는 생성자
}
}
💡 생성자(constructor)
: 위의 예시에서 클래스를 생성할 때 사용하는 Student() 같은 함수
생성자 이름은 클래스 이름과 같음
클래스를 처음 만들 때 멤버 변수나 상수를 초기화 함
new
다음에 써주어야 생성자로 인식함
디폴트 생성자
클래스를 만들 때 생성자를 입력해주지 않으면, 클래스 파일을 컴파일할 때 자바 컴파일러가 자동으로 디폴트 생성자
를 만들어 줌
생성자 직접 추가
생성자를 프로그래머가 직접 추가할 수도 있음
인스턴스 생성 동시에 멤버 변수 값을 지정하고 싶을 때 생성자를 직접 구현함
생성자를 하나라도 입력하면, 디폴트 생성자는 만들어지지 않음
this 예약어
this는 자기 자신을 가리키는 예약어
생성자를 직접 구현할 때 아래와 같이 사용
public class Student {
int studentID;
String studentName;
int grade;
String address;
Student(){} // 디폴트 생성자
Student(int studentID){
this.studentID = studentID // l-value는 멤버 변수
// r-value는 지역 변수
}
}
생성자가 두 개 이상 제공되는 경우
(디폴트 생성자, 프로그래머 입력 생성자) 생성자 오버로드💡 메서드(method) == 멤버 함수
: 메서드는 함수(function)의 한 종류
반복적으로 수행되는 어떤 기능을 미리 구현해 놓고 필요할 때마다 호출하여 사용 가능
public int add (int x, int y) {
int result;
result = x + y;
return result;
}
public void setStudentName(studentName) {
this.studentName = studentName;
// studentName이 해당 클래스 멤버변수일 때
}
매서드 호출은 main()
에서 함
함수 이름과 함께 매개 변수를 입력하면 실행
return 값이 있는 메서드의 경우 해당 값을 변수에 받아서 활용
int a = add(num1, num2);
num1과 num2의 합을 반환하는 메서드 add
💡 매개 변수
: 함수 내부에서 사용할 괄호 안의 변수
아래 예시의 x, y 가 매개 변수
매개 변수는 지역 변수(스택에 저장)
, 함수가 끝나면 사라짐
public int add (int x, int y) {
int result;
result = x + y;
return result;
}
getter : 값을 얻는 get()
메서드
setter : 값을 지정하는 set()
메서드
// getter
public String getStudentName() {
return studentName;
}
// setter
public void int setStudentID(studentID) {
this.studentID = studentID;
}
getter와 setter 만들어주는 단축키
shift
+ Alt
+ S
> Generate Getter and Setter
클래스
: 붕어빵 틀 🔩
인스턴스
: 붕어빵 🐟🐟🐟🐟🐟... 비슷해보여도 다 다른 붕어빵
💥 인스턴스 = 실제로 사용할 수 있도록 메모리 공간(힙)이 할당된 클래스
클래스 정의로 틀을 만들어 놓으면, main()
함수에서 인스턴스 생성
Student student1 = new Student();
위의 구문에서 student1
이 참조 변수
참조 변수는 인스턴스를 가리키는 클래스형 변수
student1
의 멤버 변수를 도트 연산자(.)로 접근 가능함
System.out.println(student1.studentName)
System.out.println(student1.studentID)
용어 | 설명 |
---|---|
객체 | 객체 지향 프로그램의 대상, 생성된 인스턴스 |
클래스 | 객체를 프로그래밍하기 위해 코드로 만든 상태 |
인스턴스 | 클래스가 메모리에 생성된 상태 |
멤버 변수 | 클래스의 속성, 특성 = 인스턴스 변수 |
메서드 | 멤버 변수를 이용하여 클래스의 기능을 구현 |
참조 변수 | 메모리에 생성된 인스턴스를 가리키는 변수 |
참조 값 | 생성된 인스턴스의 메모리 주소 값 |
객체 지향 프로그래밍에서는 예약어를 사용해 클래스 내부의 변수나 메서드, 생성자에 대한 접근 권한을 지정
할 수 있음
이러한 상황에 쓰이는 예약어가 접근 제어자
💡 public 예약어
: public
으로 선언한 변수나 메서드는
외부 클래스에서 접근이 가능하며, 외부 클래스가 사용할 수 있음
💡 private 예약어
: private
으로 선언한 변수나 메서드는
외부 클래스에서 사용할 수 없음
▶ private 변수에 접근하기 위해 클래스 내에 public 매서드를 정의
▶ public 메서드를 통해 private 변수에 접근 가능
접근 제어자 | 설명 |
---|---|
public | 외부 클래스 어디서나 접근할 수 있음 |
private | 같은 클래스 내부에서만 접근할 수 있음 |
protected | 같은 패키지 내부와 상속 관계의 클래스에서만 접근할 수 있고, 그 외 클래스에서는 접근할 수 없음 |
아무것도 없는 경우 | default이며 같은 패키지 내부에서만 접근할 수 있음 |
🔥 가시성으로 따지면, 오른쪽으로 갈 수록 가시성이 높음
private >> default >> protected >> public
💡 인스턴스 블록
: class 안에 아무것도 앞에 붙지 않고 있는 블럭
class Data {
int a, b, c; // 멤버 변수
{
// 인스턴스 블록
}
...
}
static
: 공통으로 사용, 기준, 붕어빵 틀의 영역 🔩
=> 공통으로 사용하기 때문에 여러 개 만들지 않고, 딱 하나만 만들어서 사용
static 변수
== 정적 변수
== 클래스 변수
: 클래스에서 공통으로 사용하는 기준 변수
static int serialNum;
static 메서드
== 클래스 메서드
: static 변수를 위한 메서드
(만들어질 지 안만들어질 지 모름!)
사용 불가public static int getSerialNum() {
return serialNum;
}
변수 유형 | 선언 위치 | 사용 범위 | 메모리 | 생성과 소멸 |
---|---|---|---|---|
지역 변수(로컬 변수) | 함수 내부 | 함수 내부에서만 사용 | 스택 | 함수 호출시 생성, 함수 끝나면 소멸 |
멤버 변수(인스턴스 변수) | 클래스 내부 | 클래스 내부에서 사용하고 private이 아니면 참조 변수로 다른 클래스에서도 사용 | 힙 | 인스턴스 생성 시 생성, GC가 메모리 수거 시 소멸 |
static 변수(클래스 변수) | static+클래스 내부 | 클래스 내부에서 사용하고 private이 아니면 참조 변수로 다른 클래스에서도 사용 | 데이터 영역 | 프로그램이 메모리에 load될 때 생성, 프로그램 끝나고 메모리 해제할 때 소멸 |
싱글톤 패턴
: 인스턴스를 단 하나만 생성하는 디자인 패턴, static
을 응용하여 구현 가능
🔽 회사와 직원들을 객체 지향 프로그램으로 구현할 때,
직원들은 여러 명이어도 회사는 하나로 해야함(모두 다 같은 회사 소속)
회사
객체는 하나만 생성해야 함 = 싱글톤 패턴
1) 생성자를 private으로 만들기
2) 클래스 내부에 static으로 유일한 인스턴스 생성하기
단 하나의
인스턴스 생성3) 외부에서 참조할 수 있는 public 메서드 만들기
4) 실제 사용 코드 작성하기