[JAVA] 객체 지향 프로그래밍(OOP)

지수·2021년 6월 30일
0

플레이데이터

목록 보기
3/50
post-thumbnail

💬 3일차 후기: 국비지원 프로그래밍 교육 커리큘럼 빡세다는 이야기 많이 들었지만 TIL을 새벽 3시에 쓰고 있게 될 줄이야.......🤔 바빠도 예습, 복습을 잊지말고 하자...🔥

1. 객체 지향 프로그래밍이란?

🔅 객체 지향 프로그래밍의 핵심은 은닉 + 상속 + 다형성 🔅

학부 때부터 객체 지향 프로그래밍이라는 말을 정말 많이 들었는데, (맨날 딸려나오는 붕어빵 비유..) 들어도 들어도 익숙해지지 않는 개념이었다. 알겠는데 모르겠달까..;;;🐟🐟🐟

여담으로, 프로그래밍에 가장 관심을 갖게된 계기가 데이터베이스 설계 수업을 들으면서부터인데
이번에 객체 지향 프로그래밍 개념을 다시 배우면서, 데이터 모델링 과정이 떠올랐다.

현실 세계의 코끼리를 컴퓨터 세계의 데이터 베이스로 옮기려면?
코끼리 : 발의 개수, 코의 길이, 몸무게, ...

데이터베이스를 설계할 때 개념을 추상화하고, 개념 간의 관계를 정의하는 것이 객체 지향 프로그래밍의 개념과 유사한 것이다..!

💡 객체 지향 프로그래밍
: 현실 세계의 객체를 컴퓨터 세계로 옮기기 위해,
객체를 정의하고, 객체 간 협력을 프로그래밍하는 것



2. 클래스

객체 지향 프로그래밍은 현실 세계의 객체 하나 하나를 클래스로 프로그래밍한다.
클래스는 객체의 속성기능을 코드로 구현한 것이다.
=> 클래스를 정의한다.

클래스 : 학생
속성 : 학번, 이름, 학년, 주소,... => 멤버 변수
기능 : 이름을 말하다, 학교를 가다, 버스를 타다,... => 메서드(멤버 함수)

클래스 정의와 생성

🔽 위에서 예로 든 학생 클래스 정의(메서드 없는 클래스)

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는 지역 변수
    }
}
  • 생성자 오버로드
    위의 예시처럼 생성자가 두 개 이상 제공되는 경우(디폴트 생성자, 프로그래머 입력 생성자) 생성자 오버로드
    필요에 따라 매개 변수가 다른 생성자를 여러 개 만들 수 있고,
    원하는 생성자를 선택해 사용 가능




3. 메서드

💡 메서드(method) == 멤버 함수
: 메서드는 함수(function)의 한 종류
반복적으로 수행되는 어떤 기능을 미리 구현해 놓고 필요할 때마다 호출하여 사용 가능

메서드 정의

  • return 값이 있을 때
public int add (int x, int y) {
	int result;
    result = x + y;
    return result;
}
  • return 하지 않을 때 (void)
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와 setter

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



4. 인스턴스

클래스와 인스턴스

클래스 : 붕어빵 틀 🔩
인스턴스 : 붕어빵 🐟🐟🐟🐟🐟... 비슷해보여도 다 다른 붕어빵
💥 인스턴스 = 실제로 사용할 수 있도록 메모리 공간(힙)이 할당된 클래스
클래스 정의로 틀을 만들어 놓으면, main() 함수에서 인스턴스 생성


참조 변수와 도트 연산자(.)

Student student1 = new Student();

위의 구문에서 student1이 참조 변수
참조 변수는 인스턴스를 가리키는 클래스형 변수

student1멤버 변수를 도트 연산자(.)로 접근 가능함

System.out.println(student1.studentName)
System.out.println(student1.studentID)


5. 객체 지향 용어 정리

용어설명
객체객체 지향 프로그램의 대상, 생성된 인스턴스
클래스객체를 프로그래밍하기 위해 코드로 만든 상태
인스턴스클래스가 메모리에 생성된 상태
멤버 변수클래스의 속성, 특성 = 인스턴스 변수
메서드멤버 변수를 이용하여 클래스의 기능을 구현
참조 변수메모리에 생성된 인스턴스를 가리키는 변수
참조 값생성된 인스턴스의 메모리 주소 값


6. 은닉

접근 제어자

객체 지향 프로그래밍에서는 예약어를 사용해 클래스 내부의 변수나 메서드, 생성자에 대한 접근 권한을 지정할 수 있음
이러한 상황에 쓰이는 예약어가 접근 제어자


public과 private

💡 public 예약어
: public으로 선언한 변수나 메서드는
외부 클래스에서 접근이 가능하며, 외부 클래스가 사용할 수 있음

💡 private 예약어
: private으로 선언한 변수나 메서드는
외부 클래스에서 사용할 수 없음

▶ private 변수에 접근하기 위해 클래스 내에 public 매서드를 정의
▶ public 메서드를 통해 private 변수에 접근 가능


접근 제어자의 종류

접근 제어자설명
public외부 클래스 어디서나 접근할 수 있음
private같은 클래스 내부에서만 접근할 수 있음
protected같은 패키지 내부와 상속 관계의 클래스에서만 접근할 수 있고, 그 외 클래스에서는 접근할 수 없음
아무것도 없는 경우default이며 같은 패키지 내부에서만 접근할 수 있음

🔥 가시성으로 따지면, 오른쪽으로 갈 수록 가시성이 높음

private >> default >> protected >> public 


7. 인스턴스 블록

💡 인스턴스 블록
: class 안에 아무것도 앞에 붙지 않고 있는 블럭

class Data {
	int a, b, c;  // 멤버 변수
    {
       // 인스턴스 블록
    }

...
}
  • 생성자가 호출되면 무조건 1등으로 실행됨
  • 인스턴스 블록 안에서도 멤버 변수 접근됨
  • 인스턴스 블록 안은 항상 실행됨



8. static 변수와 메서드

static : 공통으로 사용, 기준, 붕어빵 틀의 영역 🔩
=> 공통으로 사용하기 때문에 여러 개 만들지 않고, 딱 하나만 만들어서 사용

static 변수

static 변수 == 정적 변수 == 클래스 변수
: 클래스에서 공통으로 사용하는 기준 변수

  • 프로그램이 실행되어 메모리에 load 될 때 생성
  • 인스턴스 생성과 관계없이 우선 생성, 호출 가능
  • 호출 시 참조 변수가 아닌 클래스 이름으로 직접 호출(권장) 가능
  • 모든 인스턴스가 공유함(참조 변수가 동일한 변수의 메모리 가리킴)
static int serialNum;

static 메서드

static 메서드 == 클래스 메서드
: static 변수를 위한 메서드

  • 인스턴스 생성과 관계없이 우선 생성, 호출 가능
  • 호출 시 참조 변수가 아닌 클래스 이름으로 직접 호출(권장) 가능
  • static 메서드 내부에서는 인스턴스 변수(만들어질 지 안만들어질 지 모름!) 사용 불가
public static int getSerialNum() {
	return serialNum;
}


9. 변수의 유효범위

변수의 종류

  • 지역 변수
  • 멤버 변수(인스턴스 변수)
  • static 변수

각 변수별 특징

변수 유형선언 위치사용 범위메모리생성과 소멸
지역 변수(로컬 변수)함수 내부함수 내부에서만 사용스택함수 호출시 생성, 함수 끝나면 소멸
멤버 변수(인스턴스 변수)클래스 내부클래스 내부에서 사용하고 private이 아니면 참조 변수로 다른 클래스에서도 사용인스턴스 생성 시 생성, GC가 메모리 수거 시 소멸
static 변수(클래스 변수)static+클래스 내부클래스 내부에서 사용하고 private이 아니면 참조 변수로 다른 클래스에서도 사용데이터 영역프로그램이 메모리에 load될 때 생성, 프로그램 끝나고 메모리 해제할 때 소멸


10. 싱글톤(singleton) 패턴

싱글톤 패턴 : 인스턴스를 단 하나만 생성하는 디자인 패턴, static을 응용하여 구현 가능

🔽 회사와 직원들을 객체 지향 프로그램으로 구현할 때,
직원들은 여러 명이어도 회사는 하나로 해야함(모두 다 같은 회사 소속)
회사 객체는 하나만 생성해야 함 = 싱글톤 패턴

1) 생성자를 private으로 만들기

  • 생성자를 명시적으로 만들고(디폴트 생성자가 생기지 않도록)
  • 생성자의 접근 제어자를 private으로 지정

2) 클래스 내부에 static으로 유일한 인스턴스 생성하기

  • 외부에서는 인스턴스를 생성할 수 없게 만들었으니 내부에서 단 하나의 인스턴스 생성
  • 외부에서 인스턴스에 접근하지 못하도록 private으로 선언

3) 외부에서 참조할 수 있는 public 메서드 만들기

  • 유일한 인스턴스를 외부에서 사용만 할 수 있도록 public 메서드 생성
  • public 메서드를 통해 인스턴스 반환 = 인스턴스에 접근할 수 있는 유일한 방법
  • 다른 인스턴스 생성과 상관없이 호출할 수 있어야 하기 때문에 static으로 선언

4) 실제 사용 코드 작성하기

profile
사부작 사부작

0개의 댓글