Welcome! Everything is fine.

[1-1] 클래스와 객체1(1) ~ (3) 본문

자격증 및 기타 활동/J2KB

[1-1] 클래스와 객체1(1) ~ (3)

개발곰발 2021. 8. 10.
728x90

📌 J2KB_초급 JAVA 스터디

목표

  • 인프런 <Do it! 자바 프로그래밍 입문> 완강하기
  • Java에 대한 기본적인 내용 익히기
  • 미니 프로젝트 완성하기

계획

notion을 통하여 공부계획을 세우고, 매주 캘린더에 그날의 공부 인증 링크와 백준 문제 풀이 1개 이상을 올린다. 토요일 정기 세션에서는 잘 이해가 가지 않는 부분에 대하여 이야기 해본다.

날짜 공부 범위
21.08.08 ~ 21.08.14 클래스와 객체1(1) ~ 클래스와 객체2(3)
21.08.15 ~ 21.08.21 클래스와 객체2(4) ~ 상속과 다형성(1)
21.08.22 ~ 21.08.28 상속과 다형성(2) ~ 인터페이스와 다형성 구현(2)
21.08.29 ~ 21.09.04 인터페이스 활용하기(3) ~ 컬렉션 프레임워크 - Stack, Queue, HashSet
21.09.05 ~ 21.09.11 컬렉션 프레임워크 - TreeSet, HashMap, TreeMap ~ 자바 입출력(2)

+) 아래는 내가 만든 공부 인증 노션 페이지다. 비록 2명이지만 서로 진도 체크도 하고 각자 정리한 내용을 캘린더에 올려 공유하며 공부했다. 그냥 카톡으로 인증할때보다 체계적이어서 의욕이 더 생겼다.

 

💡 용어 정리

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

클래스 : 객체를 프로그래밍하기 위해 코드로 만든 상태

 인스턴스 : 클래스가 메모리에 생성된 상태

 멤버 변수 : 클래스의 속성, 특성

 메서드 : 멤버 변수를 이용하여 클래스의 기능을 구현

 참조 변수 : 메모리에 생성된 인스턴스를 가리키는 변수

 참조 값 : 생성된 인스턴스의 메모리 주소 값

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

자바는 객체 프로그래밍 언어다. 여기서 객체란 구체적, 혹은 추상적인 데이터의 단위이다. 이러한 객체를 기반으로 하는 프로그래밍을 객체 지향 프로그래밍이라고 한다.

클래스

클래스란 객체에 대한 속성과 기능을 코드로 구현한 것으로, '클래스를 정의한다'라고 한다. 클래스의 특징은 다음과 같다.

  • 변수와 메서드를 그룹으로 묶는다.
  • 하나의 자바 파일에 하나의 클래스를 두는 것이 원칙이다. 그러나 여러 개의 클래스가 같이 있는 경우 public 클래스는 단 하나이며, public 클래스와 자바 파일의 이름은 동일해야한다.
  • 대부분 대문자로 시작한다.

메서드

메서드는 객체의 기능을 제공하기 위해 클래스 내부에서 구현되는 함수이다.

  • 함수 이름 : 함수의 기능과 관련하여 명명한다.
  • 매개 변수 : 함수의 수행을 위해 필요한 변수이다.
  • return : 함수 수행결과를 반환하기 위한 예약어이다.
  • 함수 반환 형 : 반환 값의 자료형을 나타낸다. 반환 값이 없는 경우 void라고 쓴다.

인스턴스

인스턴스란 클래스를 사용하기 위해서 new 키워드를 이용하여 해당 클래스를 복제한 것이다. 다음은 인스턴스의 사용 예시다. new 키워드로 인해 Student 라는 클래스의 복제본이 생겼고, 이 복제본을 studentlee 라는 변수에 담았다. 따라서 studentlee의 데이터 타입은 Student이므로 앞에 Student 라고 적은 것이다.

Student studentlee = new Student();

studentlee 부분을 참조 변수라고 한다. 이러한 참조 변수는 다음과 같이 도트 연산자( . )를 이용하여 접근할 수 있다. 

Student studentlee = new Student();
studentlee.studentName = "이순신";

아래 코드는 수업에 나온 예시다. Student.java 라는 파일이기 때문에 public 클래스 명 역시 Student 이며, 그 안에 int형 변수 2개와 String형 변수 2개를 선언했다. showStudentInfo( ) 라는 메서드에서는 StudentName과 address를 출력하는 기능을 하고있다. main( ) 함수에선 이러한 클래스를 new 키워드를 이용하여 인스턴스화 한 뒤, studentlee 라는 참조 변수에 각각 값을 부여했다. 그리고나서 showStudentInfo( ) 메서드를 호출하여 이름과 주소를 출력했다.

public class Student {
	
	int studentID;
	String studentName;
	int grade;
	String address;
	
	public void showStudentInfo() {
		System.out.println(studentName + ", " + address);
	}
    
	public static void main(String[] args) {
		Student studentlee = new Student();
		studentlee.studentName = "이순신";
		studentlee.studentID = 101;
		studentlee.address = "서울시 서초구";
		
		studentlee.showStudentInfo();
	}
}

 

생성자(constructor)

생성자란 다음 예시에서 인스턴스 생성 시 new 키워드와 함께 사용한 맨 뒤의 Student( )를 가리킨다. 객체를 초기화하는 역할을 한다. 또한 생성자는 내가 어떤 객체를 생성하면서 해야할 일, 하고 싶은 일을 구현하는 용도로 사용된다. 클래스에 생성자가 하나도 없는 경우, 컴파일러가 컴파일 하기 전에 디폴트 생성자를 넣어준다. 생성자가 하나라도 있다면 컴파일러는 디폴트 생성자를 제공하지 않는다.

Student studentlee = new Student();

디폴트 생성자는 아래 예시와 같이 매개변수도 구현 코드도 없다.

public Student() {}

아래는 전체 코드이다. id 와 name 이라는 매개변수를 가진 생성자와 매개변수와 구현 코드가 없는 디폴트 생성자가 있다. 이렇게 동일한 이름을 가진 생성자가 매개변수 이름만 다른 경우생성자 오버로딩이라고 한다.

public class Student {
	int studentID;
	String studentName;
	int grade;
	String address;
	
	public Student() {} // 디폴트생성자
	
	public Student(int id, String name) {
		studentID = id;
		studentName = name;
	}
	public void showStudentInfo() {
		System.out.println(studentName + ", " + address);
	}
	
	public String getStudentName() {
		return studentName;
	}
	
	public void setStudentName(String name) {
		studentName = name;
	}
	public static void main(String[] args) {
		Student studentlee = new Student(100, "이순신");
		studentlee.address = "서울시 서초구 서초동";
		
		Student studentkim = new Student();
		studentkim.studentName = "김유신";
		studentkim.studentID = 101;
		studentkim.address = "미국 산호세";
		
		studentlee.showStudentInfo();
		studentkim.showStudentInfo();
	}

}

생성자의 특징을 정리해보자면 다음과 같다.

  • 생성자의 이름은 클래스의 이름과 동일하다.
  • 반환 타입이 없다.
  • new 키워드에 의해서만 호출된다.
  • 디폴트 생성자란 생성자가 아무것도 없을 때, 자바 컴파일러가 제공해주는 생성자이다. 필요하다면 직접 만들면 된다.

스택(stack) 메모리와 힙(heap) 메모리

메서드가 호출될 때 메서드가 사용하는 메모리를 스택(stack)이라고 한다. 스택의 구조는 택배 상자가 위로 쌓이는 것 처럼 위로 쌓이는 구조다. 스택 메모리는 메서드가 종료되면 자연히 없어진다. 아래 예시를 보면 addNum( ) 메서드의 n1, n2에 각각 num1과 num2가 들어가고, n1과 n2를 더한 result가 반환되어 sum에 들어온다. 스택 메모리 영역의 관점에서 보면 먼저 main( )메서드가 쌓이고, 그 다음 addNum( ) 메서드가 쌓인다. 그 후 addNum( ) 메서드가 끝나면 다시 main( ) 메서드만 남게 된다.

public class FunctionTest {

	public static void main(String[] args) {
		int num1 = 10;
		int num2 = 30;
		
		int sum = addNum(num1, num2);
		System.out.println(sum);

	}
	
	public static int addNum(int n1, int n2){
		int result = n1 + n2;
		return result;
	}

}

아래는 위에 설명한 내용을 그림으로 표현한 것이다.

인스턴스는 힙(heap) 메모리에 생성된다. 하나의 인스턴스가 생성되면 그 인스턴스를 위한 독립적인 공간이 힙 메모리에 잡힌다. 힙 메모리는 new 키워드에 의해 생성되는데, 스택 메모리처럼 자동으로 없어지지 않고 Garbage Collector를 실행시켜 쓰레기 객체를 제거한다.

📃 오늘부터 1주차 시작. 스택 영역과 힙 영역에 대해 헷갈려서 조금 더 찾아 봐야겠다.