JAVA/Do it! 자바 프로그래밍 입문

[Do it 자바 프로그래밍 입문] 05 클래스와 객체 1

yun.data 2023. 3. 24. 16:26

1. 객체 지향 프로그래밍과 클래스

1-1. 객체와 객체 지향 프로그래밍

  • 객체지향 프로그래밍(Object-Oriented Programming; OPP)
  • 객체를 기반으로 하는 프로그래밍
  • 객체 사이에 일어나는 일을 구현
  • 객체를 먼저 정의하고 객체의 제공 기능과 협력 구현을 고민해야 함

 

 

1-2. 클래스란?

  • 클래스: 객체의 속성과 기능을 코드로 구현한 것
  • 클래스의 이름, 멤버 변수 필요
  • 클래스 이름 코딩 컨벤션(coding convension): 대부분 대문자로 시작

 

 


2. 클래스 살펴보기

2-1. 클래스 속성을 구현하는 멤버 변수

  • 변수의 자료형
    • 기본 자료형: int, long, float, double 등
    • 참조 자료형(객체 자료형): String, Date, 클래스가 다른 클래스에서 사용하는 멤버 변수의 자료형 등

 

 

2-2. 클래스 기능을 구현하는 메서드

  • 멤버 함수(member function) or 메서드(method): 클래스 내부에서 멤버 변수를 사용하여 클래스 기능을 구현한 것

 

 

2-3. 패키지란?

  • 클래스의 묶음
  • 패키지 선언
    • 자바 소스 코드에서 클래스의 패키지 선언은 맨 위에 함
    • 클래스의 전체 이름(class full name)에는 패키지 이름이 포함되므로 같은 이름의 클래스라도 다른 패키지에 속해 있으면 서로 연관이 없음

 

 


3. 메서드

3-1. 함수란?

  • 하나의 기능을 수행하는 일련의 코드
  • 어떤 기능을 수행하도록 미리 구현해 놓고 필요할 때마다 호출하여 사용 가능

 

 

3-2. 함수의 입력과 반환

  • 매개변수: 함수의 입력으로 받는 변수
  • 반환 값: 결과 값

 

 

3-3. 함수 정의하기

  • 함수 반환형
    • int, float, double 등 반환 자료형 입력
    • 반환 값이 없는 함수의 경우 void로 작성
  • 매개변수: 매개변수가 필요없는 경우도 존재
  • return 예약어
    • 값 반환 시 사용
    • 함수 수행을 끝내고 프로그램 흐름 중에서 호출한 곳으로 다시 되돌아갈 때도 사용 가능
  • 함수 예제
public class FunctionEx {
	public static void main(String[] args) {
    	int num1 = 10;
        int num2 = 20;
        int sum = add(num1, num2)
        System.out.println(num1 + "+" + num2 + "=" + sum +);
	}
	
    public static int add(int n1, int n2) {
    	int result = n1 + n2;
        retrun = result;
	}
}

 

 

3-4. 함수 호출과 스택 메모리

  • 스택(stack): 함수만을 위한 메모리 공간
  • A(), B(), C() 순서대로 함수의 호출이 이루어졌다고 한다면 C(), B(), A() 순서로 반환되며 스택 메모리 소멸 순서도 이와 같음

 

 

3-5. 함수의 장점

  • 기능을 나누어 코드를 효율적으로 구현할 수 있음
  • 같은 기능을 매번 코드로 만들지 않고 함수를 호출하여 사용하면 됨
  • 하나의 함수에 하나의 기능을 구현하는 것이 중요

 

 

3-6. 클래스 기능을 구현하는 메서드

  • 메서드(method): 클래스 내부에서 사용하는 멤버 함수
  • 낙타 표기법(카멜 표기법, camel notation)
    • 변수와 메소드 이름의 시작을 소문사로, 이후에 작성하는 새로운 단어의 시작은 대문자로 작성하여 가독성을 높임
    • ex) setStudnetName, getStudnetName

 

 


4. 클래스와 인스턴스

4-1. 클래스 사용과 main() 함수

  • main() 함수
    • 자바 가상 머신(Java Virtual Machine; JVM)이 프로그램을 시작하기 위해 호출하는 함수
    • 클래스 내부에 만들지만 클래스의 메서드는 아님
  • main() 함수에서 클래스를 사용하는 방법
    • 만든 클래스 내부에 main() 함수를 만드는 것
    • 외부에 테스트용 클래스를 만들어 사용하는 것

 

 

4-2. new 예약어로 클래스 생성하기

  • 클래스형 변수이름 = new 생성자;
  • 클래스 생성: 클래스를 사용할 수 있도록 메모리 공간(힙 메모리)에 올림
  • 인스턴스: 실제로 사용할 수 있도록 생성된 클래스
  • 참조 변수: 인스턴스를 가리키는 클래스형 변수

 

 

4-3. 인스턴스와 참조별수

  • 객체: 의사나 행위가 미치는 대상
  • 클래스: 객체를 코드로 구현한 것
  • 인스턴스
    • 클래스가 메모리 공간에 생성된 상태
    • 인스턴스 여러 개 생성 가능
  • 참조 변수 사용
    • 도트(.) 연산자 사용
    • ex) studentKim.setStudentName = "Kim";

 

 

4-4 인스턴스와 힙 베모리

  • 힙 메모리(heap memory): 변수를 저장하는 공간
    • 클래스 생성자를 하나 호출하면 인스턴스가 힙 메모리에 생성됨
    • 클래스가 생성될 때마다 인스턴스는 다른 메모리 공간을 차지함
    • 멤버 변수를 저장하는 공간이 매번 따로 생긴다는 의미
  • 인스턴스 대입 = 인스턴스가 생성된 힙 메모리의 주소를 대입
  • 인스턴스는 힙 메모리, 지역 변수는 스택 메모리에 생성됨

 

  • 참조 변수와 참조 값
    • 인스턴스 메모리 주소: 힙 메모리에 생성, 참조 변수에 저장
    • 출력 시 '클래스 이름@주소 값(해시코드(hash code))'

 

[용어 총 정리]

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

 

 

[나 혼자 코딩] 1. 클래스를 만들고 결과 값을 출력하여라.

나이: 40살, 이름: James, 남자, 기혼, 자식: 3

[출력 결과] 나이, 이름, 결혼 여부, 자녀 수
public class C5_E1_Person {
	public int age;
	public String name;
	public boolean marriage;
	public int children;
	
	public C5_E1_Person(int age, String name, boolean marriage, int children) {
		this.age = age;
		this.name = name;
		this.marriage = marriage;
		this.children = children;
	}
	
	public void getPersonInfo() {
		System.out.println("age: " + age);
		System.out.println("name: " + name);
		System.out.println("marriage: " + marriage);
		System.out.println("children: " + children);
	}
	
	public static void main(String[] args) {
		C5_E1_Person James = new C5_E1_Person(40, "James", true, 3);
		James.getPersonInfo();
	}
}

 

 

[나 혼자 코딩] 2. 쇼핑몰 주문 내용이 다음과 같을 때 클래스를 만들고 주문 내용을 인스턴스로 생성한 후에 출력하라.

주문 번호: 201803120001
주문 아이디: abc123
주문 날짜: 2018년 3월 12일
주문자 이름: 홍길동
주문 상품 번호: P0345-12
배송 주소: 서울시 영등포구 여의도동 20번지
public class C5_E2_ShoppingMall {
	
	public String orderNumber;
	public String id;
	public String orderDate;
	public String name;
	public String orderGoodNumber;
	public String address;
	
	public C5_E2_ShoppingMall(String orderNumber, String id, String orderDate, String name,
    		String orderGoodNumber, String address) {
		this.orderNumber = orderNumber;
		this.id = id;
		this.orderDate = orderDate;
		this.name = name;
		this.orderGoodNumber = orderGoodNumber;
		this.address = address;
	}
	
	public void getOrderInfo() {
		System.out.println("주문 번호: " + orderNumber);
		System.out.println("주문자 아이디: " + id);
		System.out.println("주문 날짜: " + orderDate);
		System.out.println("주문자 이름: " + name);
		System.out.println("주문 상품 번호: " + orderGoodNumber);
		System.out.println("배송 주소: " + address);
	}

	public static void main(String[] args) {
		C5_E2_ShoppingMall order1 = new C5_E2_ShoppingMall("201803120001", "abc12",
        			"2018년 3월 12일", "홍길동", "PD0345-12", "서울시 영등포구 여의도동 20번지");
		order1.getOrderInfo();
	}
}

 

 

 

5. 생성자

5-1. 생성자란?

  • 생성자(constructor)
    • 생성자는 클래스를 생성할 때만 호출함
    • 생성자 이름은 클래스 이름과 같음
    • 반환 값이 없음
  • 디폴트 생성자(default constructor)
    • 생성자가 없는 클래스는 컴파일 시 자바 컴파일러에서 자동 생성자를 만들어줌

 

 

5-2. 생성자 오버로드(constructor overload)

  • 필요에 따라 매개변수가 다른 생성자를 여러 개 만들 수 있음

 

 


6. 참조 자료형

6-1. 참조 자료형

  • 클래스 자료형으로 선언하는 자료형
  • 기본 자료형을 사용하듯이 클래스 자료형 변수를 선언해서 사용하는 것

 

 


7. 정보 은닉

7-1, 접근 제어자 살펴보기

  • 접근 제어자(access modifier)
    • 클래스 내부의 변수나 메서드, 생성자에 대한 접근 권한을 지정하는 예약어
    • public : 외부 클래스에서 접근 가능
    • private: 외부 클래스에서 사용 불가

 

7-2. get(), set() 메서드

  • public 메서드가 제공되지 않는 경우에 접근할 수 있게 만들어주는 메서드

 

 

7-3. 정보 은닉(information hiding)

  • 객체 지향 프로그래밍 특징 중에 하나
  • 자바에서는 접근 제어를 사용하여 정보 은닉을 구현
  • private으로 선언하여 외부에서의 접근을 막음

 

[접근 제어자의 종류]

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