5주차 과제: 클래스(필수)
목표
자바의 Class에 대해 학습하세요.
학습할 것 (필수)
- 클래스 정의하는 방법
- 객체 만드는 방법 (new 키워드 이해하기)
- 메소드 정의하는 방법
- 생성자 정의하는 방법
- this 키워드 이해하기
과제 (Optional)
- int 값을 가지고 있는 이진 트리를 나타내는 Node 라는 클래스를 정의하세요.
- int value, Node left, right를 가지고 있어야 합니다.
- BinrayTree라는 클래스를 정의하고 주어진 노드를 기준으로 출력하는 bfs(Node node)와 dfs(Node node) 메소드를 구현하세요.
- DFS는 왼쪽, 루트, 오른쪽 순으로 순회하세요.
Class
- 객체를 정의해 놓은 것, 객체의 설계도/틀
- 속성과 기능으로 정의되어 있다.
- 객체를 생성하는데 사용되며 객체는 클래스에 정의된 대로 생성된다.
클래스 작성규칙
- 하나 이상의 문자로 이루어져야 한다.
- 첫 번째 글자에는 숫자가 올 수 없다.
- $,_ 외에는 특수문자 사용불가
- 자바 명령어, 키워드는 사용할 수 없다.(while, for, int 등 사용불가)
- 이름은 대소문자를 구분한다.(보통, 첫번째 글자는 대문자로 작성)
클래스의 구성
필드(field)
클래스에 포함된 변수
클래스 내에서 필드는 선언된 위치에 따라 구분됨.
1. 필드(field) - 클래스내의 멤버 변수
2. 매개 변수(parameter) - 메소드 선언에서의 변수
3. 지역 변수(local variable) - 메소드, 블록 안에서 선언되는 변수
필드의 접근 제한
지시자 | 클래스내부 | 동일 패키지 | 상속받은 클래스 | 이외의 영역 |
private | O | X | X | X |
default(no modifier) | O | O | X | X |
protected | O | O | O | X |
public | O | O | O | O |
생성자(constructor)
클래스를 가지고 객체를 생성하면, 해당 객체는 메모리에 즉시 생성된다.
하지만 이렇게 생성된 객체는 모든 인스턴스 변수가 아직 초기화되지 않은 상태
따라서 자바에서는 객체의 생성과 동시에 인스턴스 변수를 원하는 값으로 초기화할 수 있는 생성자(constructor)라는 메소드를 제공한다.
자바에서 생성자(constructor)의 이름은 해당 클래스의 이름과 같아야 한다.
메소드(method)
어떠한 특정 작업을 수행하기 위한 명령문의 집합
메소드를 사용하면 중복되는 코드의 반복적인 프로그래밍을 피할 수 있게 된다.
모듈화로 인해 전체적인 코드의 가독성이 좋아진다.
프로그램에 문제가 발생하거나 기능의 변경이 필요할 때도 손쉽게 유지보수를 할 수 있게 된다.
클래스 제어 지시자
public / defalut
접근제어자를 선언하지 않는다.
동일한 패키지 내에서만 접근가능 하다.
static
메소드나 변수를 메모리에 로딩해서 다른 클래스가 이 클래스의 인스턴스를 생성하지 않고도 사용할 수 있게 해준다
내부 클래스에서 사용 가능.
final
다른 클래스에서 이 클래스를 상속받을 수 없다.
abstract
하위 클래스에서 abstract method를 구현하게 한다.
클래스 정의 방법
public class className {
//필드(멤버변수)
int a;
int b;
// default 생성자
public className(){}
// 매개변수가 있는 생성자
public className(int a, int b) {
this.a = a;
this.b = b;
}
// 메소드
int sum(int a, int b){
return a+b;
}
public static void main(String[] args) {
//프로그램 시작
className a = new className();
a.sum(3,5);
}
}
객체 만드는 방법 (new 키워드)
// 객체 생성 방법
클래스명 객체변수명 = new 클래스명();
// student 클래스
class Student {
String name;
int age;
// 기본 생성자
public Student(){}
// 매개변수가 있는 생성자
public Student( String name, int age){
this.name = name;
this.age = age;
}
public static void main(String[] args){
// 기본생성자를 이용한 객체 생성
Student s = new Student();
// 매개변수가 있는 생성자를 이용한 객체 생성
Student s2 = new Student("sujin", 20);
}
}
new연산자란
new는 클래스 타입의 인스턴스(객체)를 생성해주는 역할을 담당한다. 여기에 조금 더 설명을 붙이면 new 연산자를 통해 메모리(Heap 영역)에 데이터를 저장할 공간을 할당받고 그 공간의 참조값(reference value /해시코드)을 객체에게 반환하여 주고 이어서 생성자를 호출하게 된다. 인스턴스를 핸들하기 위해서는 new 연산자를 통해 참조값을 저장한 객체로만 접근이 가능하다.
객체 생성과정
메모리 할당 => 인스턴스 생성 => 주소값 생성
1. new 연산자가 s/s2객체에 저장될 메모리 공간 할당
2. 생성자가 s객체를 초기화
3. new 연산자가 새로 생성된 객체의 주소를 s/s2 변수에 저장
4. s/s2를 통해 Student에 접근 가능.
메소드 정의하는 방법
public static 리턴타입(자료형/void) 메소드명() {
실행할 코드 작성
return; // 리턴타입이 void일 경우 return 생략
}
메소드의 리턴타입
메소드 내에서 동작하고 얻은 결과를 반환해주는 역할
return문 뒤에는 어떤한 구문도 올 수 없다.
return문은 리턴타입에 맞는 데이터를 반환해야함.
메소드 호출 => 메소드명();
// sum 메소드 정의
public static int sum() {
return 3+5;
}
public static void main(String[] args) {
sum(); //실행결과 8
}
생성자 정의하는 방법
생성자란
객체가 메모리에 할당될 때마다 자동으로 실행되는 메소드를 의미
객체가 생성될 때 한번 호풀되는 메소드이며, 리턴형이 없고 클래스명과 함수명이 같다.
반드시 public이라는 수식어가 붙어야 하며
하나의 클래스에 여러개의 생성자가 존재할 수도 있다.
public 클래스명 (초기화 할 변수) {
인스턴스 변수 초기화 명령문
}
기본 생성자(디폴트 생성자)
매개변수가 없는 생성자를 의미
매개변수를 갖는 생성자
생성자에 매개변수가 있는 생성자를 의미
class Student{
String name;
int age;
//기본 생성자
public Student() {}
//매개변수를 갖는 생성자
public Student(String name, int age){
this.name = name;
this.age = age;
}
this 키워드 이해하기
this키워드는 인스턴스 자기 자신을 가리키는 키워드이다.
this를 통해 클래스 메소드 및 생성자에서 자기 자신의 데이터를 업데이트하거나 조작할 수 있다.
=> 클래스를 기반으로 생성된 인스턴스를 가리키는 참조, 인스턴스 자체와는 다르다.
public class Student {
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
this키워드를 이용하여 작성한 클래스 코드로, this란 키워드를 통해 생성자 및 세터,게터메소드에서
이 클래스를 기반으로 생성된 인스턴스의 필드 데이터에 접근할 수 있다.
참고
www.tcpschool.com/java/java_class_component
'Development > 백기선님의 온라인 자바 스터디' 카테고리의 다른 글
8주자 과제: 인터페이스 (0) | 2021.01.28 |
---|---|
6주차 과제: 상속 (0) | 2021.01.27 |
4주차 과제 : 제어문(필수) (0) | 2020.12.12 |
3주차 과제: 연산자 (0) | 2020.11.25 |
2주차 과제: 자바 데이터 타입, 변수 그리고 배열 (0) | 2020.11.19 |