Part 7. 객체 지향 프로그래밍

Hyunsu·2023년 2월 14일
0

국비 교육

목록 보기
12/36
post-thumbnail

개강한지 일주일만에 객체 공부에 들어갔다
어렵지만 재미있게 객체 공부 열심히 해보자구 ✍️

📝 목차

  1. 객체 지향 언어
  2. 클래스
  3. 필드
  4. 생성자
  5. 메서드

1. 객체 지향 언어

📌 객체 지향 3 + 1 특징

  • 캡슐화 (Encapsulation) : 데이터들과 기능을 하나로 묶어 관리
  • 상속 (Inheritance) : 재사용을 위함 extends
  • 다형성 (Polymorphism) : 다양한 형태를 가지려는 성질 abstract interface
  • 추상화 (Abstraction) : 공통된 코드만 작성

모두 중요하지만 다형성은 가장 중요하며 상속을 기반으로 구현된다.

📌 객체 지향 언어

객체란 자신의 속성 (값 및 데이터) 과 기능 (동작 및 행동) 이 다른 것들과 구분되어 식별 가능한 것이다. 현실 세계는 각각의 객체로 이루어져있으며 발생하는 모든 사건들은 객체간의 상호작용이다.

자바에서 객체란 new 연산자를 통해 메모리 영역에 생성된 것이다.
즉 객체란 클래스에 정의된 내용대로 메모리에 할당된 Object 결과물이다.

Student s = new Student(); // 객체화 (인스턴스화)

new 연산자와 생성자를 사용해 객체 생성 시 Heap 메모리 영역에 서로 다른 자료형의 데이터가 연속으로 나열 및 할당된 객체 공간이 생성되고 클래스를 인스턴스화하여 인스턴스 객체를 생성한다.

📌 용어 정리

클래스 (class)

객체의 특성 (속성 멤버변수 및 기능 메서드) 에 대한 정의를 한 것이며 클래스 작성 시 추상화와 캡슐화가 반드시 적용되어야 한다. 혼동하지 말아야 할 것은 클래스 자체는 객체가 아니고 객체를 생성하기 위한 설계도라는 것이다.

추상화 (abstraction)

유연성을 확보하기 위해 프로그램에서 필요한 공통점을 추출하고 불필요한 부분을 제거하는 과정이다.

캡슐화 (Encapsulation)

추상화를 통해 정리된 속성과 기능을 하나로 묶고 데이터의 직접 접근 방지를 하는 것이다. 이로 인해 정보 은닉 효과가 발생한다. 다음은 캡슐화의 원칙이다.

  • 멤버 변수에 대한 접근 권한은 private 을 원칙으로 한다.
  • 멤버 메소드는 클래스 밖에서 접근 가능하도록 public 으로 설정한다.

2. 클래스

클래스의 구성 멤버는 필드 (멤버변수 또는 속성) 와 메서드 (기능) 와 생성자로 이루어져있다.

// 클래스 표현식
[접근제한자][예약어] class 클래스명 {
	// 속성값 설정
	[접근제한자][에약어] 자료형 변수명;


    // 기능정의 설정
    [접근제한자] 생성자명() { }

    [접근제한자] 반환명 메소드명(매개변수) {
        기능 정의
    }
}

// 클래스 예시
public class Member {
	private String name;
	private int age;
	
	public Member() {}
	
	public String getName() {
		return name;
	}
	
	public void setName(String name) {
		this.name = name;
	}
	
	public int getAge() {
		return age;
	}
	
	public void setAge(int age) {
		this.age = age;
	}
}

클래스 접근제한자

기호구분같은 패키지 내전체
+publicOO
~(default)O

public 은 모든 패키지 내에서 접근이 가능하며 import 를 사용하여 접근한다.
default 는 같은 패키지 내에서만 접근이 가능하다.


3. 필드

객체의 속성을 적는 영역으로 인스턴스 변수와 클래스 변수를 묶어 필드 (멤버변수) 라고 부른다.

// 필드 표현식
[접근제한자][예약어] class 클래스명 {
	[접근제한자][에약어] 자료형 변수명 = 초기값;
}

// 필드 예시
public class Academy {
	public int temp1;
	protected int temp2;
	int temp3; // 접근제한자 생략 시 default
	private int temp4; // 캡슐화 원칙으로 private 사용
}

📌 필드

  • 인스턴스 변수

인스턴스가 생성될 때 마다 해당 인스턴스에 포함된 변수

public String name;
public int grade;
  • 클래스 변수 (static 변수)

프로그램 시작 시 정적 메모리 영역에 자동 할동되는 변수

public static String schoolName = "KH 초등학교";

📌 필드 접근제한자

기호구분해당 클래스 내부같은 패키지 내후손 클래스 내전체
+publicOOOO
#protectedOOO
~(default)OO
-privateO

public 은 전체 어디서든지 접근이 가능하며 private 은 현재 클래스에서만 가능하다.
default 는 같은 패키지까지 가능하며 protected 는 같은 패키지에 추가로 패키지가 달라도 상속 관계면 가능하다.

📌 필드 예약어

static

같은 타입의 여러 객체가 공유할 목적의 필드에 사용하며 프로그램 시작 시 정적 메모리 영역인 static 영역에 자동 할당되는 멤버에 적용한다.

public class Student {
	public static String schoolName = "KH 초등학교";
}

public class StudentRun {
	// static 변수는 참조 변수 대신 클래스명.필드명으로 사용 권장
	Student.schoolName = "KH 국민학교";
}

동적 메모리 영역은 heap 영역에 생성되고 가비지컬렉터에 의해 소멸되며 정적 메모리 영역은 static 영역에 생성되고 프로그램 종료 전까지 계속 남아있다가 프로그램 종료 시 소멸된다.

자바 실행 단계는 먼저 코드를 훑어보며 static 키워드를 찾고 static 키워드가 포함된 필드나 변수 및 메서드를 static 메모리 영역에 생성 또는 추가한 뒤 main 영역을 실행한다.

final

하나의 값만 계속 저장해야 하는 변수에 사용하는 예약어이다.

public class Academy {
	private final int TEMP1 = 100; // 대문자 표기 원칙
}

📌 클래스 초기화 블럭

초기화의 순서는 클래스 변수의 경우 JVM 기본값 다음 명시적 초기값 다음 클래스 초기화 블록 초기값 순으로 우선 순위가 높다.
인스턴스 변수의 경우 JVM 기본값 다음 명시적 초기값 다음 인스턴스 초기화 블록 초기값 다음 생성자를 통한 초기값 순으로 우선 순위가 높다.

[접근제한자][예약어] class 클래스명 {
	[접근제한자] static 자료형 필드1 = 10;
    [접근제한자] 자료형 필드2 = 20; // 명시적 초기값
    
    static { 필드1 = 30; }
    { 필드2 = 40; }
}
  • 인스턴스 초기화 블럭

인스턴스 변수를 초기화 하는 블럭

{
	memberId = "mem1";
	memberPw = "1234";
	memberName = "고길동";
	memberAge = 40;
}
  • 클래스 초기화 블럭

프로그램 실행 시 static 변수를 초기화 하는 용도의 블럭으로 프로그램 실행 시 한 번만 수행

static {
	programName = "회원관리 프로그램";
}

4. 생성자

📌 생성자

new 연산자를 통해 heap 메모리에 할당될 때 객체 안에서 만들어지는 필드를 초기화하고 생성 시 필요한 기능을 수행하는 일종의 메서드이다.
이 때 무조건 생성자명을 클래스명과 똑같이 지정해주어야 한다.

// 생성자 표현식
[접근제한자][예약어] class 클래스명 {
	[접근제한자] 클래스명() { }
    [접근제한자] 클래스명(매개변수) { this.필드명 = 매개변수; }
}

// 생성자 예시
public class Academy {
	public Academy() { } // 기본 생성자
	public Academy(int studentNo, String name) { // 매개변수 있는 생성자
		this.studentNo = studentNo;
		this.name = name;
	}
}
  • 기본 생성자

작성하지 않으면 컴파일러가 자동으로 기본 생성자를 생성한다.

  • 매개변수 생성자

객체 생성 시 전달받은 값으로 객체를 초기화 하기 위해 사용하며
매개변수 생성자가 작성되어 있다면 컴파일러가 기본 생성자를 자동으로 생성해주지 않는다.

상속에서 사용 시 반드시 기본 생성자를 작성하고 오버로딩을 이용해 작성한다.

📌 오버로딩

한 클래스 내에 동일한 이름의 메소드를 여러 개 작성하는 기법으로 오버로딩의 조건은 메소드 이름이 동일해야하며 매개변수의 자료형 또는 개수 또는 순서 중 하나라도 달라야 한다.

📌 this

  • this

모든 인스턴스의 메서드에 숨겨져있는 필드로 현재 인스턴스의 시작주소가 저장되어있어 현재 인스턴스를 가리켜 참조한다.

public class Academy {
	private String name;
	public Academy() { }
	public Academy(String name) { this.name = name; }
}
  • this ( )

같은 클래스의 다른 생성자를 호출 할 때 사용하며 반드시 첫 번째 줄에 선언해야 한다.

public class Academy {
	private int age;
	private String name;
	public Academy() { this(20, "김철수"); }
	public Academy(int age, String name) {
		this.age = age;
    	this.name = name; 
	}
} 

5. 메서드

전달 값이 없는 상태로 호출하거나 어떤 값을 전달하여 호출하며 함수 내에 작성된 연산을 수행한다.
메서드 작성 시 클래스를 구분하여 작성하는 것이 좋다.

// 메서드 표현식
[접근제한자][예약어] 반환형 메소드명(매개변수) {
	기능 정의
}

// 메서드 예시
public void information() {
	System.out.println(studentNo);
}

예를 들어 MethodExRun 클래스에는 객체 생성 및 실행을 할 수 있도록 하고 MethodExView 클래스에는 콘솔에 내용 출력 및 입력을 받는 용도의 객체를 만들기 위한 내용을 작성한다. MethodExService 클래스에는 기능 제공용 객체를 만들기 위한 내용 (비즈니스 로직) 을 작성한다.

📌 메서드 예약어

구분전체
staticstatic 영역에 할당하여 객체 생성 없이 사용
final종단의 의미이며 상속 시 오버라이딩 불가능
abstract미완성이란 의미이며 상속하여 오버라이딩으로 완성시켜 사용해야함
synchronized동기화 처리이며 공유 자원에 한 개의 스레드만 접근 가능
static finalstatic 과 final 의 의미를 둘 다 가짐

📌 메서드 반환형

구분전체
void반환형이 없음
기본 자료형반환 값이 기본 자료형
배열반환 값이 배열이면 배열의 주소값 반환
클래스반환 값이 해당 클래스 타입의 객체이면 해당 객체의 주소값 반환

패턴 형태의 문자열을 반환하는 방법은 다음과 같다.

// 패턴 형태 문자열 표현식
String.format("패턴", 변수)

// 패턴 형태 문자열 예시
switch (op) {
	case "+" : result = String.format("%d %s %d = %d", num1, op, num2, num1 + num2); break;
}

📌 메서드 매개변수

구분전체
( )매개변수가 없음
기본 자료형값을 복사하여 전달하며 매개변수 값을 변경해도 본래 값은 수정되지 않음
배열배열이나 클래스 등 참조형을 전달 시 데이터의 주소 값을 전달하므로
매개변수를 수정하면 본래의 데이터가 수정됨 (얕은 복사)
클래스배열과 동일
가변인자매개변수의 개수를 유동적으로 설정하는 방법으로
가변 매개변수 외 다른 매개변수가 있으면 가변 매개변수를 마지막에 설정

String 은 참조형이므로 주소를 저장한다.
따라서 참조형을 비교할 때는 값이 아닌 주소를 비교하게 되는데 대부분 같지않다로 판별된다.
이를 해결하기 위해 참조형의 값 자체를 비교하는 equals ( ) 함수를 사용한다.

a.equals(b) // 객체의 값이 같으면 true 다르면 false

📌 getter 및 setter 와 기타 메서드

  • setter : 필드에 변경할 값을 전달 받아서 필드 값을 변경하는 메서드
public void setStudentNo(int studentNo) {
	this.studentNo = studentNo;
}
  • getter : 필드에 기록된 값을 읽어서 요청한 쪽으로 읽은 값을 넘기는 메서드
public int getStudentNo() {
	return studentNo;
}
  • toString : 객체가 가지고 있는 모든 필드 값을 하나의 문자열로 표기하여 반환
profile
현수의 개발 저장소

0개의 댓글