[포스코x코딩온] 웹개발자 풀스택 과정 17주차 | Java 객체지향 클래스 문법

구준희·2023년 10월 24일
0

[포스코x코딩온]교육

목록 보기
36/40
post-thumbnail
post-custom-banner

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

객체 지향 프로그래밍에서는 모든 데이터를 객체(object)로 취급하며, 이러한 객체가 바로 프로그래밍의 중심이 된다.
객체(object)란 실생활에서 우리가 인식할 수 있는 사물로 설명할 수 있다. 이러한 객체의 상태(state)와 행동(behaivor)을 구체화하는 형태의 프로그래밍이 바로 객체 지향 프로그래밍이다. 이때 객체를 만들어 내기 위한 설계도와 같은 개념을 클래스(class)라고 한다.

클래스(class)

자바에서 클래스(class)란 객체를 정의하는 틀 또는 설계도와 같은 의미로 사용된다.

자바에서는 이러한 설계도를 가지고, 여러 객체를 생성하여 사용하는 식으로 프로그래밍을 이어나간다.

클래스는 객체의 속성 변수를 나타내는 필드(field)와 객체의 함수를 나타내는 메소드(method)로 구성되어있다.

  • 클래스 : 객체 데이터를 만드는 템플릿(설계도)
  • 객체 : 클래스(템플릿)과 new 연산자를 통해 만든 실 데이터가 들어있는 변수
  • 인스턴스 : 어떤 객체가 어떤 클래스의 객체인지 관계를 설명할 때(객체선언 == 클래스 인스턴스화)
  • 클래스 필드/ 멤버 / 속성 : 클래스 안에 있는 변수를 지칭
  • 생성자 : 클래스로 객체를 만들때 각 객체의 멤버 데이터(변수)들의 값을 초기 생성 해줄 수 있는 특수 메서드

인스턴스(instance)

자바에서 클래스를 사용하기 위해서는 우선 해당 클래스 타입의 객체(object)를 선언해야 한다. 이렇게 클래스로부터 객체를 선언하는 과정을 클래스 인스턴스 화라고 한다.
또한, 이렇게 선언된 해당 클래스 타입의 객체를 인스턴스(instance)라고 한다. 즉, 인스턴스란 메모리에 할당된 객체를 의미한다.\

// 클래스
class Animal { ... }

public class Sample {
    public static void main(String[] args) {
        // 변수 cat은 객체
        // 변수 catd은 Animal 클래스의 인스턴스
        Animal cat = new Animal(); // 클래스라는 설계도를 통해 객체 데이터를 new 생성
    }
}

메소드(method)

자바에서 클래스는 멤버(member)로 속성을 표현하는 필드(field)와 기능을 표현하는 속성을 표현하는 필드(field)와 기능을 표현하는 메소드(method)를 가진다.
그 중에서 메소드(method)는 어떤 특정 작업을 수행하기 위한 명령문의 집합이라고 볼 수 있다.

  • 접근제어자/지정자 : 해당 메소드에 접근할 수 있는 범위를 명시
  • 반환 타입(return type) : 메소드가 모든 작업을 마치고 반환하는 데이터의 타입을 명시
  • 메소드명 : 메소드를 호출하기 위한 이름을 명시
  • 매개변수 목록(parameters) : 메소드 호출 시에 전달되는 인수의 값을 저장할 변수들을 명시
  • 구현부 : 메소드의 고유 기능을 수행하는 명령문의 집합

생성자(constructor)

클래스를 가지고 객체를 생성하면, 해당 객체는 메모리에 즉시 생성된다. 하지만 이렇게 생성된 객체는 동시에 인스턴스 변수를 원하는 값으로 초기화할 수 있는 생성자(constructor)라는 메소드를 제공한다. 자바에서 생성자(constructor)의 이름은 해당 클래스의 이름과 같아야 한다.
즉, Car 클래스의 생성자는 Car()가 된다.

생성자 규칙

  1. 생성자의 목적은 객체 초기화
  2. 생성자 이름은 클래스 이름과 반드시 동일
  3. 생성자는 new를 통해 객체를 생성할 때, 객체당 한 번 호출
  4. 생성자는 객체가 생성될 때 반드시 호출됨
  5. 생성자는 리턴 타입을 지정할 수 없음
  6. 개발자가 생성자를 생성하지 않았으면 컴파일러가 자동으로 기본 생성자 삽입
  7. 생성자는 여러 개 작성 가능(오버로딩)

패키지(package)

자바에서 패키지란 클래스와 인터페이스의 집합을 의미한다.
서로 관련있는 클래스나 인터페이스를 함께 묶음으로써 파일을 효율적으로 관리할 수 있게 된다. 또한 협업 시 서로 작업한 클래스 사이에서 발생할 수 있는 이름 충돌 문제까지도 패키지를 이용하면 피할 수 있게 된다.

package com.oracle.util; // 해당 클래스가 속해있는 패키지 선언하여 그 패키지에 들어있는 다른 클래스들도 따로 선언없이 바로 사용 가능

// 클래스파일명
public class Sample {
}

import문

import 문은 자바 컴파일러에 코드에서 사용할 클래스의 패키지에 대한 정보를 미리 제공하는 역할을 한다. 따라서 import 문을 사용하면 다른 패키지에 속한 클래스를 패키지 이름을 제외한 클래스 이름만으로 사용가능하게 된다.

//import문의 선언
import 패키지이름.클래스이름;
import 패키지이름.*;

//예시
import java.*; //틀린예시

import java.awt.*;
import java.util.*;

접근제어자

객체지향에서 정보은닉(data hiding)이란 사용자가 굳이 알 필요가 없는 정보는 사용자로부터 숨겨야 한다는 개념이다. 만일 어떠한 변수로 프로그래밍 동작이 결정된다 라고 하면, 외부 사용자가 이 변수로 접근해서 값을 바꾼다는 행위를 철저히 봉쇄 해야 한다. 안 그러면 프로그램이 망가질 수 있기 때문이다.
따라서 접근 제어자는 외부로부터 데이터의 보호가 필요하고 사용자가 사용하는데 필요없는 로직들을 숨기기 위해서 사용된다고 보면된다.(이러한 것을 은닉화/캡슐화 라고 한다.)

  • private : 같은 클래스 내에서만 접근 가능
  • default : 같은 패키지 내에서만 접근이 가능
  • protected : 같은 패키지 내에서, 그리고 다른 패키지의 자손클래스에서 접근이 가능
  • public : 제한이 없음

Getter, Setter

getter와 setter는 private를 관리하는 메서드이다.
private으로 선언하고 나서 다른 클래스에서 접근하려면 해당 클래스 안의 메서드를 통해서만 접근이 가능한데 그 관리하는 메서드를 getter와 setter라고 부른다

class A {
	private int num = 10;
    
    //getter
	public int getNum() {
		return a;
	}
    
    //setter
	public void setNum(int a) {
		this.a = a;
	} 
}

private 변수를 다른 클래스에 꺼내는 메서드는 get + 변수명(첫글자 대문자)
private 변수에 다른 값을 초기화하는 메서드는 set + 변수명(첫글자 대문자)
이런식으로 이름에 규칙을 짓고 해당 메서드를 getter,setter 라고 부른다.

static 제어자

  • static 멤버는 메모리 측면에서 메서드(스태틱) 영역에 생성된다.
    반대로 인스턴스 멤버는 new 생성자를 통해 힙 영역에 생성된다.
  • 동일한 클래스의 모든 객체에 공유
  • static 메서드 내에서는 this 사용 불가능.(기본적으로 this 키워드는 인스턴스 멤버에 대한 접근이기 때문)
//예시
class Car {
    // 클래스 필드(static 변수) : 한 클래스에서 공통적으로 사용 되는 변수
    static int var; 
	
    // 클래스 메소드(static 메소드)
    static void func() { 
         // static 메소드에서는 this 키워드 사용 불가능. (this는 인스턴스 멤버에 대한 접근 키워드 이니까)
    }
}

Car.var; // 클래스명.멤버명 으로 바로 접근됨
Car.func();

non-static 멤버

  • 공간적 특성 : 멤버는 객체마다 별도로 존재한다.
    인스턴스 멤버라고도 부른다.

  • 시간적 특성 : 객체 생성시에 멤버가 생성된다.

    • 객체가 생길 때 멤버도 생성된다.
    • 객체 생성 후 멤버 사용이 가능하다.
    • 객체가 사라지면 멤버도 사라진다.
  • 공유의 특성 : 공유되지 않는다.

    • 멤버는 객체 내에 각각의 공간을 유지한다.

static 멤버

  • 공간적 특성 : 멤버는 클래스당 하나가 생성된다.

    • 멤버는 객체 내부가 아닌 별도에 공간에 생성된다.
    • 클래스 멤버라고 부른다.
  • 시간적 특성 : 클래스 로딩 시에 멤버가 생성된다.

    • 객체가 생기기 전에 이미 생성된다.
    • 객체가 생기기 전에도 사용이 가능하다.(즉, 객체를 생성하지 않고도 사용할 수 있다.)
    • 객체가 사라져도 멤버는 사라지지 않는다.
    • 멤버는 프로그램이 종료될 때 사라진다.
  • 공유의 특성 : 동일한 클래스의 모든 객체들에 의해 공유된다.

제약조건

  • static 메소드에서 non-static 멤버에 접근할 수 없다.(객체가 생성되지 않은 상태에서 non-static 멤버는 만들어져 있지 않기 때문에)
  • non-static 메소드에서 static 멤버에 접근 할 수 있다.
  • static 메소드에서는 this 사용불가

참고 1
참고 2
참고 3
참고 4

profile
꾸준히합니다.
post-custom-banner

0개의 댓글