Java

[Java] Object(객체)

wwxs 2024. 9. 5. 17:47

Object(객체)

  • 데이터(속성)와 해당 데이터를 처리하는 방법(메소드)을 포함하는 프로그래밍의 기본 단위

객체 지향 프로그래밍

  • OOP (Object-Oriented Programming)
더보기
더보기
//객체 지향 프로그래밍의 예시
//ex) 학교 관리 '시스템' 구축

//학생 객체
//: 학생의 이름, 학번, 수강 과목 등의 데이터
//: 성적 조회, 수강 신청 등의 메소드

//교수 객체
//: 교수의 이름, 연구 분야, 담당 과목 등의 데이터
//: 강의 계획서 업로드, 성적 입력 등의 메소드

//수업 객체
//: 과목명, 강의 시간, 강의실 등의 데이터
//: 강의 자료 업로드, 출석 체크 등의 메소드

 

객체 지향 프로그래밍의 주요 개념

 

1. 클래스

  • 객체를 생성하기 위한 템플릿, 데이터(속성)와 메소드(행동)을 정의

2. 객체(Object)

  • 클래스의 인스턴스, 실제로 메모리에 할당되어 동작하는 구체적인 엔티티

3. 상속(Inheritance)

  • 한 클래스(부모)의 속성과 메소드를 다른 클래스(자식)가 받아서 사용하는 기능

4. 다형성(Polymorphism)

  • 같은 메소드 호출이 다른 클래스의 객체에 대해 다른 방식으로 실행

5. 캡슐화(Encapsulation)

  • 객체의 데이터를 외부로부터 숨기고, 내부의 메소드를 통해서만 해당 데이터를 조작할 수 있게 하는 것

6. 추상화(Abstraction)

  • 복잡한 세부사항을 숨기고 사용자에게 필요한 정보만을 제공

 

객체지향 프로그래밍의 장점(중요성)

  • 재사용성 증가
  • 유지보수성 증가
  • 확장성 증가

자바(JAVA)에서의 객체 지향 프로그램

  • 코드의 모든 구조가 객체로 표현 가능
  • 프로그램의 유연성과 모듈성 증

 

객체 지향 프로그래밍 - 클래스와 객체

 

1. 클래스(Class) 정의

  • 객체를 만들기 위한 템플릿
  • 객체의 상태(속성)와 행동(메서드)을 정의
  • 실제 데이터나 코드 X, 데이터와 기능의 구조를 정의하는 하나의 개념적인 틀
  • class 키워드를 사용하여 정의

2. 객체(Object) 정의

  • 클래스에 정의된 속성과 메서드를 가지고 있는 '실체'
  • 클래스를 기반으로 생성, 클래스의 인스턴스라고 불림
  • 각 객체는 독립적인 상태와 행동을 가짐
  • 다른 객체와 상호작용 가능

 

클래스 선언 방법

더보기
더보기
// 클래스 선언 방법
		// [접근제한자] class ClassName {
			// 속성 & 메서드
		// }
		
		// : 접근 제한자(제어자)는 생략 가능
		// >> 클래스의 가시성을 정의 (접근에 대한 권한을 부여)
		// >> public, private, protected, default
        
        class Car{
			// 속성(필드)
			int maxSpeed;
			doubl
		}

 

더보기
더보기
class Car {
	// 클래스의 속성(필드)
	String model; // 모델
	int year; // 제조 연도
	
	// 클래스의 행동(메서드)
	// : 클래스 내부에서 정의된 함수, 객체의 행동을 표현
	// >> 클래스의 데이터(필드)를 사용하여 특정 작업을 수행하거나
	//		, 해당 값을 변경 가능, 값을 반환
	
	// void: 해당 메서드의 반환하는 결과가 X
	// >> 반환(return)이 존재하지 않을 경우 메서드명 앞에 반드시 작성
	void display() {
		System.out.println("Model: " + model + ",Year: " + year);
	}
	
	// 클래스의 생성자
	// : 클래스의 이름과 동일한 메서드
	// >> 객체가 생성될 때 자동으로 호출
	// >> 클래스 내부의 필드를 초기화할 때 주로 사용
	Car(String model, int year){
		// this 키워드
		// >> 클래스의 필드와 생성자로 받아오는 데이터의 이름이 같을 경우 구분을 위해 사용
		this.model = model;
		this.year = year;
	}
}

 

객체 생성 (객체 인스턴스화)

  • new 연산자를 사용
  • 클래스의 생성자를 호출 → 객체의 초기 상태를 설정
  • 클래스명의 클래스의 새로운 객체를 생성
  • 해당 객체에 대한 참조(주소)를 클래스 타입의 변수에 저장

 

객체 사용

 

더보기
더보기
// 1. 필드 접근(.연산자 사용)
		System.out.println(myCar.model);	// volvo xc60
		System.out.println(myCar.year);		// 2024
		
// 2. 메서드 호출(.연산자 사용)
		myCar.display();	// Model: volvo xc60, Year: 2024

 

객체 생성 구문

  • 클래스명 객체명 = new 클래스명(생성자 매개변수)

(예제 코드)

더보기
더보기
package chapter04;

// 클래스 생성 (Book, Person, ...)
// : 속성 2개
// : 메서드 1개
class Person {
	String name;
	int age;
	
	void display(){
		System.out.println("name: " + name + ", age: " + age);
	}
	
	Person(String name, int age){
		this.name = name;
		this.age = age;
	}
}

class Book {
	// 클래스 내부의 데이터(속성)
	String title;	// 책 제목
	String publisher; // 출판사
	int pageNumber;	// 책 페이지 수
	
	// 클래스 내보의 동작(메서드)
	void displayInfo() {
		System.out.println(title + publisher);
	}
	
	// === 생성자 함수 ===
	// : new 연산자 사용 시 호출 될 메서드
	// >> 생략 시 속성에 기본값이 
	// 일반 타입: int(0), boolean(false), char("");
	// 참조 타입: null
	
	// >> 생략 시 클래스명과 동일하면서 매개변수가 없는 메서드
	Book(String title, String publisher, int pageNumber) {	// 매개변수로 받은 데이터로 속성 초기화
		this.title = title;
		this.publisher = publisher;
		this.pageNumber = pageNumber;
	}
}


public class Object04 {
	public static void main(String[] args) {
		// 위에서 정의한 클래스를 사용하여 객체 인스턴스화
		Person person = new Person("홍동현", 25);
		
		Book myBook = new Book("백설공주", "코리아it아카데미", 50);
		Book anotherBook = new Book("신데렐라", "에이원플라자", 100);
		
		
		// 속성 출력
		System.out.println(person.name);
		System.out.println(person.age);
		
		System.out.println(myBook.pageNumber);
		System.out.println(myBook.publisher);
		System.out.println(myBook.title);
		
		System.out.println(anotherBook.pageNumber);
		System.out.println(anotherBook.publisher);
		System.out.println(anotherBook.title);
		
		// 메서드 호출
		person.display();
		
		myBook.displayInfo();	// 백설공주코리아it아카데미
		anotherBook.displayInfo(); 	// 신데렐라에이원플라자
		
		myBook.pageNumber = 1234;
		System.out.println(myBook.pageNumber); 	// 1234
	}
}

 

객체 지향 프로그램의 변수

 

1. 필드

  • 객체의 지속적인 상태를 저장하는 클래스 내부의 변수

2. 지역 변수

  • 메서드가 실행되는 동안에만 존재하는 일시적인 변수

3. 인스턴스 변수

  • 클래스의 각 객체(인스턴스)에 속한 변수
  • 클래스 내부에서 선언, 객체가 생성될 때 메모리에 할당

4. 클래스(정적) 변수

  • static 키워드를 사용하여 선언되는 변수
  • 클래스의 모든 인스턴스에서 공유되는 데이터
  • 프로그램이 시작될 때 생성, 프로그램이 종료될 때 소멸 (메모리 할당)
더보기
더보기
class CarClass{
	// 인스턴스 변수
	// : 각 객체(인스턴스) 마다 다른 값을 가짐
	String color;
	int speed;
	String brand;
	
	// 정적 변수
	// : 해당 클래스로 생성되는 모든 객체가 동일한 값을 가짐
	// : 데이터타입 앞에 static 키워드 사용
	
	// 변수 선언과 동시에 공유될 값을 초기화
	static int tireNumber = 4;
	static int doorNumber = 4;
	
	void accelerate(int increment) {
		// increment: 지역 변수
		// >> 메서드 내부에서만 유효
		speed += increment;	// speed = speed + increment;
	}
}

public class Object05 {
	public static void main(String[] args) {
		
		// CarClass 인스턴스화
		CarClass car1 = new CarClass();
		CarClass car2 = new CarClass();
		
		// 객체의 인스턴스 변수
		car1.brand = "kia";
		car1.color = "black";
		
		// 객체의 클래스 변수: 클래스명.속성 (각 인스턴스로도 호출 가능)
		System.out.println(CarClass.tireNumber);	// 4
		
		// >> 클래스 변수는 클래스명으로 접근을 권장!
//		System.out.println(car1.tireNumber);	// 4
//		car1.tireNumber = 5;
//		System.out.println(car2.tireNumber);	// 5
		
		System.out.println(car2.brand);	// null
	}
}

 

클래스 변수 VS 인스턴스 변수

형태 : 필드(속성, 멤버 변수) 중에 static이 붙은 것은 클래스 변수, 붙지 않은 것은 인스턴스 변수 

선언 위치 : 클래스 영역 내에서 선언

 

생성 시기 & 사용 시기 & 호출 방법

 

1. 클래스 변수

  • 클래스가 메모리에 올라갈 때
  • 객체 생성 이전에도 사용 가능
  • 클래스명.변수명

2. 인스턴스 변수

  • 인스턴스가 생성되었을 때
  • 객체 생성 이후에만 사용 가능
  • 객체명.변수명
더보기
더보기
class Example{
	int instaceValue;
	static int classValue;
}

class Counter{
	// 클래스 변수
	static int count = 0;
	
	Counter() {
		count++;
	}
}
public class Object06 {
	public static void main(String[] args) {
		Counter c1 = new Counter();
		Counter c2 = new Counter();
		Counter c3 = new Counter();
		Counter c4 = new Counter();
		Counter c5 = new Counter();
		System.out.println(c3.count);	// 5
		
		new Counter();
		new Counter();
		new Counter();
		new Counter();
		
		System.out.println(Counter.count);	// 9
	}
}

'Java' 카테고리의 다른 글

[Java] Inheritance  (0) 2024.09.09
[Java] Constructor  (0) 2024.09.06
[Java] Overloading  (0) 2024.09.06
[Java] Method  (0) 2024.09.06
[Java] Array(배열)  (0) 2024.09.05