자바의 객체, 클래스, 함수와 메서드, 인스턴스, 생성자 개념 및 특징

Yeppi's 개발 일기·2022년 5월 19일
0

JAVA

목록 보기
11/27
post-thumbnail

1. 객체(Object) 란?

현실 세계의 유무형의 모든 것

  • 명사적인 특징 : 이름, 전공, 나이 . . .
    동사적인 특징 : 공부를 한다 . . .

  • 객체의 속성
    클래스의 멤버 변수(member variable)로 선언

  • 객체 지향 프로그래밍
    객체 정의 → 각 객체의 속성을 멤버 변수로 역할을 메서드로 구현 → 객체간 협력구현



2. 클래스(Class) 란?

객체 대한 소스

  • 현실 세계의 객체 → 컴퓨터 메모리에 넣기 위한 소스코드 형태

  • 객체의 명사적 특징 → 멤버변수
    객체의 동사적 특징 → 메서드

  • 대문자로 시작

  • java 파일 하나에 클래스는 여러 개가 있을 수 있음
    • public 클래스는 하나
    • public 클래스와 .java 파일의 이름은 동일함
  • camel(카멜) notation 방식으로 명명

❗ 목적과 관점에따라 클래스 구성요소는 언제든지 달라질 수 있다 ❗



3. 함수(Function) 란?

하나의 기능을 수행하는 일련의 코드

함수 정의하기

  • 함수의 이름 / 매개 변수 / 반환 값 / 함수 몸체(body)

  • int add(매개변수) { 기능 코드 . . . return 타입 } ⇒ int는 함수의 반환타입

    만약, 반환값과 매개변수 없다면? ⇒ void add( )



4. 메서드(Method) 란?

객체가 제공하는 기능

  • = 멤버 함수 (member function)

  • 메서드를 구현함으로써 객체의 기능이 구현 됨

  • 객체의 기능을 구현하기 위해 클래스 내부에 구현되는 함수

  • 클래스 마지막에 선언된 것

  • 메서드의 이름은 그 객체를 사용하는 객체(클라이언트)에 맞게 짓는것이 좋음
    예) getStudentName()


1) 메서드 구조

Int sum(int x, int y) { // 2개의 정수를 매개변수로 받아오는 sum 메소드
	Return x +y;
}

2) 매개변수

메서드안에 선언된 로컬변수

  • 메소드가 기능 수행에 필요한 데이터를 받아들이는 것 = 매개변수

  • 멤버변수만으로 기능을 처리 가능하면?
    매개변수를 선언하지 안함

  • 로컬 변수에 해당
    ⇒ 메소드가 종료되는 순간 삭제 됨 ❗ 메모리에서 삭제 ❗

  • 매개변수 개수는 적을수록 좋음
    회사마다 3개/5개 이내 규칙이 있음


🍑 멤버 변수 VS 멤버 메서드 VS 로컬 변수 🍑

  • 멤버변수 = 글로별변수 = 전역변수
    → 명사적 특징
  • (멤버)메서드
    → 동사적 특징
  • 로컬변수
    → 메소드 안에 선언된 변수

📌 매개변수와 반환 값 실습 📌

	// 매개변수O 반환값O
	public static int addNum(int num1, int num2) {
		int result;
		result = num1 + num2;
		return result;
	}
	
	// 매개변수O 반환값X
	public static void sayHello(String greeting) {
		
		System.out.println(greeting);
	}
	
	// 매개변수X 반환값O
	public static int calcSum() {
		int sum = 0;
		int i;
		
		for(i = 0; i<=100; i++) {
			sum += i;
		}
		return sum;
	}
	
	public static void main(String[] args) {
		int n1 = 10;
		int n2 = 20;
		
		int total = addNum(n1, n2);  // 반환 값 있는 메서드 사용
		System.out.println(total);
		
		sayHello("안녕하세요"); // 반환 값 없는 메서드 사용
		
		total = calcSum();  // 반환 값 있는 메서드 사용
		System.out.println(total);

	}

출력결과

30
안녕하세요
5050


3) 생성자 메서드

  • 해당 페이지 목차 6. 생성자란? 참고
  • = 생성자
  • 클래스 이름과 동일한 이름의 메소드
  • 객체의 멤버변수 초기화
  • 생성자가 호출되는 시점 ⇒ 클래스로부터 객체(인스턴스)를 생성할 때
    ex. new Student() 할 때


🍑 함수 VS 메서드 🍑

  • 함수
    1. 어디에 속해 있지 않음
    2. 단독모듈, 호출해서 쓰면 됨
  • 메서드
    1. 클래스안에 속해 있음
    2. 클래스의 멤버변수를 활용해서 구현된 것
    3. ❗ 일종의 함수 ❗

5. 인스턴스(Instance) 란?

메모리상의 객체, 개발자의 객체

  • 모두 인스턴스
    = 현실 세계에 존재하는 객체
    = 클래스로 컴퓨터 메모리에 생성된 객체

  • 실제 클래스 기반으로 생성된 객체(인스턴스)는 각각 다른 멤버 변수 값을 가짐
    ex. 학생의 클래스에서 생성된 각각의 인스턴스는 각각 다른 이름, 학번, 학년등의 값을 가짐

  • new 키워드 : 인스턴스 생성


힙 메모리

  • C나 C++ 언어에서는 사용한 동적 메모리를 프로그래머가 해제 시켜야 함
    ex. free() 나 delete 이용

  • 생성된 인스턴스는 동적 메모리(heap memory) 에 할당

  • 각 인스턴스는 다른 메모리를 가지게 됨 ⇒ 힙(동적메모리)

  • 자바의 Gabage Collector 가 주기적으로 사용하지 않는 메모리를 수거

  • 하나의 클래스로 부터 여러개의 인스턴스가 생성되고, 각각 다른 메모리 주소를 가지게 됨

  • 필요할 때 할당을 받고, 해제할 때 delete로 해제

  • studentLee → 참조변수

  • 주소값, 참조값, 가상 어드레스(아래 사진) 를 가짐



6. 생성자(Constructor) 란?

1) 생성자 개념 및 특징

1. 메소드 이름 == 클래스 이름

  • 대문자로 시작

2. 리턴 타입이 없음, void 도 안됨

  • void 추가 시 메소드로 인식해버림
  • new 와 함께 호출/생성해야 함 ❗
    ex. new Student();

3. 객체 생성 시 ❗ 자동으로 호출됨 ❗

  • 일반 메소드처럼 참조변수를 통해 호출할 수 없음

4. 생성되는 ❗ 객체의 멤버변수 초기화 ❗를 담당

  • 매개변수가 비어있는 생성자 == 디폴트 생성자

5. 기본 생성자가 자동으로 제공

  • 생성자가 하나도 정의되지 않은 클래스일 때

6. 하나의 클래스에 여러 개의 생성자를 오버로딩

7. 특수한 형태인 this() 생성자 존재



2) 생성자 구조

생성자 기본 문법

클래스이름 ([argument_list]) {

	[statements]
}


3) 기본 생성자 (default constructor)

기본적으로 자동 생성

  • 클래스에는 반드시 적어도 하나 이상의 생성자 존재
  • 기본 생성자

    • 매개변수를 가질 수 없기 때문에 멤버변수를 기본 값으로 초기화

    • 클래스에 생성자가 하나도 없을 때 기본으로 제공

    • 클래스에 생성자가 하나도 없는 경우?
      컴파일러가 생성자 코드를 넣어 줌
      ex. public Student(){}

  • 기본 값
    String → null
    int → 0
  • 멤버변수는 자동으로 초기화 ⭕
    지역변수는 자동으로 초기화 ❌

default 생성자 구조

public class Studnet {
	// 멤버변수1, 2, 3...;
    
    // 디폴트 생성자
    Student() {
    
    }
}


4) 생성자 만들기

  • 컴파일러가 제공해 주는 기본 생성자 외, 필요에 의해 생성자를 직접 구현 할 수 있음

  • 객체 필수 요소가 필요하다면 디폴트 생성자는 만들지 않음

📌 생성자 구조 및 초기화 실습 📌

  • 매개변수가 있는 생성자를 이용하여, 멤버변수 값을 원하는 값으로 초기화
  • 기본값으로 초기화 : null, 0
  • 원하는 값으로 초기화 : "yeppi", 99
    public class Student {

        String name;
        int score;

        Student() {
            System.out.println("---> Student 디폴트 생성자 실행!");
        }

        void printInfo() {
            System.out.println(name + "의 점수는? " + score);
        }
    }
	public static void main(String[] args) {
    
		// Student 객체 생성 및 초기화
		Student kim = new Student();
		System.out.println("이름: " + kim.name);
		System.out.println("점수: " + kim.score);
		System.out.println("");
		
        // 원하는 값 넣기
		kim.name = "yeppi";
		kim.score = 99;

		System.out.println("이름: " + kim.name);
		System.out.println("점수: " + kim.score);
		kim.printInfo();
		
	}

출력결과

---> Student 디폴트 생성자 실행!
이름: null
점수: 0

이름: yeppi
점수: 99
yeppi의 점수는? 99


📌 간략한 실습 📌

  • 데이터 타입 : 클래스 Student
    • 클래스는 데이터 크기가 고정되어 있지 않음
  • 생성자 : new Studnet()

  • 생성자 하나에 여러개의 인스턴스(studentLee, studnetKim) 생성 가능

  • 인스턴스마다 각기 다른 멤버변수(studnetID, studentName, address) 가짐

		Student studentLee = new Student();
		studentLee.studentID = 00001;
		studentLee.studentName = "Lee";
		studentLee.address = "서울시 관악구";
		
		studentLee.showStudentInfo();
		
		Student studentKim = new Student();
		studentLee.studentID = 00002;
		studentKim.studentName = "Kim";
		studentKim.address = "대구광역시";
		
		studentKim.showStudentInfo();
		
		System.out.println(studentLee);
		System.out.println(studentKim);

출력결과

Lee,서울시 관악구
Kim,대구광역시
ch03.Student@5e91993f
ch03.Student@1c4af82c


🍑 용어 정리 🍑

객체

👉 객체 지향 프로그램의 대상
👉 생성된 인스턴스

클래스

👉 객체를 프로그래밍 하기위해 코드로 정의해 놓은 상태

인스턴스(객체)

👉 new 키워드를 사용하여 클래스를 메모리에 생성한 상태

메서드

👉 멤버 변수를 이용하여 클래스의 기능을 구현한 함수

멤버 변수

👉 멤버변수 = 글로별변수 = 전역변수
👉 클래스의 속성, 특성

로컬 변수

👉 메소드 안에 선언된 변수

참조 변수

👉 메모리에 생성된 인스턴스를 가리키는 변수(ex. 스택안에 있는 studentLee)

참조 값

👉 생성된 인스턴스의 메모리 주소 값


자바의 기초라고 할 수 있는 개념에 대해 정리해보았는데,
아직 공부하면서 필기해둔 내용 + 실습한 코드들이 아주 많다...
복습하면서 부지런히 더 정리해보자..!

profile
imaginative and free developer. 백엔드 / UX / DATA / 기획에 관심있지만 고양이는 없는 예비 개발자👋

0개의 댓글