Java 객체 지향 프로그래밍(OOP)

Jinny·2022년 1월 19일
0

TIL

목록 보기
20/28
post-thumbnail

객체

객체 지향 프로그래밍(OOP(Object Oriented Programming))

객체 중심의 프로그래밍으로 연관되는 속성과 기능을 묶어서 부품화 시킨다.(캡슐화)

객체(Object or Instance)

객체는 주변에 존재하는 모든 사물(자동차, 건물, 옷 등), 생명체(사람, 고양이 등) 하나 하나가 다 객체라고 할 수 있다.
클래스에 정의된 내용대로 메모리에 할당된 결과물(Object)이다.

객체 지향 프로그래밍(OOP) 특징

  • 추상화(Abstraction) : 프로그램이 필요로 하는 실제 데이터들을 모델링하는 기술
  • 캡슐화(EnCapsulation) : 객체 지향의 가장 중요한 데이터 보호 기술
  • 상속(Inheritance) : 클래스의 재사용과 소스 코드의 중복 제거를 목적으로 하는 기술
  • 다형성(Polymorphism) : 상속을 이용하여 여러 클래스 타입을 하나의 클래스 타입으로 다루는 기술

절차지향 vs 객체지향

절차지향 : 작업의 흐름에 따라 코드를 작성

객체지향 : 객체의 관계에 따라 코드를 작성

객체지향 프로그래밍의 장점

  1. 프로그램 모듈의 재사용 가능
  2. 프로그램의 확장 및 유지 보수가 용이함
  3. 쉬운 프로그램의 개발로 인한 생산성 향상
  4. 완성도 높은 모듈 사용으로 프로그램의 안정성 확보

접근제한자

외부에서 접근 가능한 멤버와 불가능한 멤버를 구분하는 용도로 사용하며 클래스의 캡슐화를 지원한다.

캡슐화

추상화를 통해 정리된 데이터들과 기능을 하나로 묶어 관리하는 기법이며 데이터의 접근 제한을 원칙으로 한다.

캡슐화 원칙

  1. 클래스의 멤버 변수에 대한 접근 권한은 private을 원칙으로 한다.
  2. 클래스의 멤버 변수에 대한 연산처리를 목적으로 하는 함수들을 클래스 내부에 작성한다.
  3. 멤버 함수는 클래스 밖에서 접근할 수 있도록 public으로 설정한다.
  • (+) public
    클래스 안과 밖, 패키지 안과 밖에 있는 모든 클래스들이 접근 가능하다.
  • (#) protected
    비 상속시에는 default와 동일하며, 같은 패키지에 속한 클래스 간에만 멤버의 접근이 가능하다.
    다른 패키지에 있는 클래스일 때는 상속관계의 후손클래스 내에서만 부모클래스의 멤버에 접근이 가능하다.
  • (~) default (package private)
    같은 패키지에 속한 클래스 간에만 멤버들에 대한 접근이 가능하다.
  • (-) private
    멤버변수의 캡슐화를 위해 사용되는 제한자로 클래스 안에서만 접근이 가능하며 클래스 밖에서는 접근이 불가능하다.

접근제한자의 공개 범위
public > protected > default > private 순으로 좁아지며 protected는 상속관계가 아니면 잘 사용하지 않는다.


클래스(Class)

객체를 생성하기 위해 속성과 기능을 정의한 설계도
속성(상태) = 변수, 기능(행위) = 메소드로 구성한다.
사물이나 개념의 공통 요소를 추상화(abstraction)하여 정의한다.

클래스 정의(선언)

클래스명.java로 생성한다. 반드시 클래스명과 대/소문자까지 일치해야 된다.

💡 [접근제한자] [클래스 식별자] class 클래스이름

접근제한자

클래스의 접근에 제한을 두는 예약어로 public 과 default (package private) 두 가지가 사용된다.

  • public class 클래스명 : 패키지 안/밖 모두 접근(사용) 가능한 클래스를 의미한다.
  • class 클래스명 : 선언된 패키지 안에서만 접근(사용) 가능한 클래스를 의미한다.

클래스 식별자 (Identifier)
클래스의 종류를 지정하는 예약어로 final, abstract 두 가지가 사용될 수 있다.

  • public final class 클래스명 : 종단 클래스, 더 이상 상속시킬 수 없는 클래스, 서브(후손) 클래스를 만들 수 없다.
  • public abstract class 클래스명 : 추상(미완성된) 클래스, 상속을 이용해 후손 클래스가 부모의 미완성된 기능을 완성시킨다.

클래스 파일

일반적으로 소스파일(xxx.java) 당 하나의 클래스를 선언한다. 두 개 이상의 클래스 선언도 가능하며 파일 이름과 동일한 클래스명에만 public 사용 가능하다.

컴파일 시 각 클래스마다 따로 .class 파일이 생성되고 가급적이면 하나의 클래스만 선언하는 것이 좋다.

// ex) Aaa.java
public class Aaa {
}
class Abc {
}

클래스명명 규칙

  1. 하나 이상의 문자로 이루어져야 함
  2. 첫 글자는 숫자가 올 수 없다
  3. $, _ 외의 특수문자 사용 불가
  4. 예약어 사용 불가
  5. 관례적으로 첫 글자는 대문자, 나머지는 소문자로 사용
  6. 두 단어 이상이면 각 단어의 첫 글자 대문자로 사용
  7. 한글도 가능하지만 영어로 작성

필드

객체의 데이터가 저장되는 곳이며 변수와 비슷하지만 생성자나 메소드 외부에 선언되어 클래스 전체에서 사용된다.

필드 특징

  1. 객체가 생성될 때 만들어지고, 객체가 소멸할 때 같이 소멸됨.
  2. 필드는 기본타입 또는 참조타입 변수로 생성 가능
  3. 선언 시 초기값을 넣을 수 있음
  4. 클래스 내부에서 필드 사용 시 이름만 불러서 사용하거나 this.이름으로 사용
  5. 클래스 외부에서 필드 사용 시 객체명.필드명 으로 사용

필드 접근 제한자

💡 [접근제한자] [예약어] class 클래스명 { [접근제한자] [예약어] 자료형 변수명 [=초기값]; // 멤버변수 }
// 필드 예시
public class Member {
	public int tmp1;
	protected int tmp2;
	int tmp3; // 접근제한자 생략 시 default
	private int tmp4; // 캡슐화 원칙으로 private 사용
	// tmp1 = 3; 필드에서 변수 사용은 안된다! (메소드 안에서 사용 가능)
}

변수의 종류

  1. 인스턴스(Instance) 변수
    클래스 {} 안에 선언되며, 클래스에 대한 객체를 동적 메모리에 할당할 때 객체 공간 안에 생성되는 필드들을 말한다.
💡 접근제한자 자료형 변수명;
public class Var1 {
	private int num1; // 인스턴스 멤버 변수
}
  1. 클래스 변수
    클래스 {} 안에 선언되며 멤버 변수 선언시 자료형 앞에 static 키워드를 붙여 선언한 필드를 말하며, 해당 클래스형 객체들이 모두 공유하는 필드가 된다.
    - static
    같은 타입의 여러 객체가 공유할 목적의 필드에 사용한다.
    프로그램 실행 시 정적 메모리 영역에 자동 할당된다.
    같은 타입의 모든 객체가 꼭 필요한 공통적인 속성을 가진 변수에 사용한다.
💡 접근제한자 static 자료형 필드명;
public class Var2 {
	private static int num2; // static(정적) 멤버변수 (클래스 변수)
	// Var2 클래스에 의해 생성된 모든 객체가 num2 필드를 공유하게 된다.
}
  1. 지역 변수
    메소드 {} 내에 선언된 변수로 메소드 내에서만 사용이 가능하다.
public class Var3 {
	public void method3() {
		int num3 = 10; // method3 메소드 안의 지역 변수임
	}
}

예약어

  • final (상수)
    필드가 가진 초기값 수정이 불가능하다.
    초기값은 필드를 선언할 때나, 생성자에서만 설정 가능하다.
    하나의 값만 계속 저장해야 하는 변수에 사용하는 예약어이다.
public class VariableExam {
	// 필드를 선언할 때, 선언과 동시에 초기값 설정
	public final int NUM = 100;

	// 생성자에서 초기화할 때
	private final int FINAL_VAR; // 필드에서 선언

	public Point() { // 생성자에서 초기화
		FINAL_VAR = 200;
	}
}
  • static final
    정적필드(static)면서 상수(final)로 고정된 값으로 한번 초기값이 저장되면 변경할 수 없다.
    관례적으로 상수이름은 모두 대문자로 지정하고 여러 단어가 연결될 경우 _로 구분
public class VariableExam {
	public static final int NUM = 100; // 반드시 선언과 동시에 초기값 설정
}

초기화 방법

  1. JVM 기본값 초기화(별도의 초기값을 지정해주지 않으면 자동으로 초기값 설정)
논리형 : false
정수형 : 0
실수형 : 0.0
문자형 : (공백)
문자열형(참조형) : null
  1. 명시적 초기화
public class VariableExam {
	public boolean var1 = true;   // 논리형
	public int var2 = 10;         // 정수형
	public double var3 = 3.5;     // 실수형
	public char var4 = 'A';       // 문자형
	public String var5 = "Hello"; // 문자열형
}
  1. 초기화 블록을 이용한 초기화
  • 인스턴스 블록 ( {} )
    객체 생성 시 마다 초기화
  • static(클래스) 블록 ( static{} )
    프로그램 시작 시 한 번만 초기화
💡 [접근제한자] [예약어] class 클래스명 { // 선언 [접근제한자] static 자료형 필드1; [접근제한자] 자료형 필드2; // 초기화 static { 필드1 = 초기값; } { 필드2 = 초기값; } }
// 인스턴스, static 초기화 블록
public class VariableExam {
	public boolean var1 = true;   // 논리형
	public static int var2 = 10;  // 정수형
	public double var3 = 3.5;     // 실수형
	public char var4 = 'A';       // 문자형
	public String var5 = "Hello"; // 문자열형

	// static 초기화
	static {
		var2 = 20;
	}

	// 인스턴스 초기화
	{
		var1 = false;
		var3 = 5.6;
		var4 = 'B';
		var5 = "안녕하세요";
	}
}
  1. 생성자를 이용한 초기화
public class VariableExam {
	public boolean var1 = true;   // 논리형
	public static int var2 = 10;  // 정수형
	public double var3 = 3.5;     // 실수형
	public char var4 = 'A';       // 문자형
	public String var5 = "Hello"; // 문자열형

	public Variable() {
		var1 = true;
		var2 = 30;
		var3 = 10.5;
		var4 = 'C';
		var5 = "반갑습니다";
	}
}
profile
코린이

0개의 댓글