변수 (1개의 자료형 + 1개의 데이터) -> 배열 (1개의 자료형 + 여러개의 데이터)
-> 구조체(여러 개의 자료형 + 여러 개의 데이터) -> 클래스 등장
💡 구조체는 접근되고 싶지 않는 부분에도 모두 접근이 되기 때문에 단점이 있어서 클래스가 등장함!
클래스는 관례상 대문자로 시작하고 낙타 표기법을 사용한다
추상화란? : 유연성을 확보하기 위해 구체적인 것은 제거한다는 의미
추상화를 거쳐서 클래스를 만듬 -> 클래스를 활용하여 객체 생성
ex) 📌 추상화 예시 : 국민 한사람의 정보를 추상화 해보자! (클래스 다이어그램)
객체
현실에 존재하는 독립적이면서 하나로 취급되는 사물이나 개념으로 클래스에 정의된 내용대로 메모리에 할당된 결과물
💡 객체와 인스턴스의 차이점
-> 둘 다 의미는 비슷하지만 용어상 인스턴스는 객체보다 더 관계
에 초점을 맞춘 것
ex) student1은 Student 클래스의 인스턴스
이다
new 연산자와 생성자를 이용하여 객체 생성 시 힙 메모리 공간에 할당된 객체 공간
Data dataA = new Data();
dataA.value = 10;
위 코드를 그림으로 나타나면
- 클래스의 멤버 변수에 대한 접근 권한은 private을 원칙으로 한다.
- 클래스의 멤버 변수에 대한 연산처리를 목적으로 하는 함수들을 클래스 내부에 작성한다.
- 멤버 함수는 클래스 밖에서 접근할 수 있도록 public으로 설정한다.
- 객체의 데이터는 객체가 제공하는 기능인
메서드
를 통해서만 접근해야한다.- 정리하면 데이터는 모두 숨기고, 기능은 꼭 필요한 기능만 노출하는 것이
캡슐화
이다.
클래스(Class)
밑에 문법 예시
[접근제한자] [예약어] 자료형 변수명 [= 초기값];
//
ex)
public class Academy {
public int temp1;
protected int temp2;
int temp3; // 접근제한자 생략 시 default
private int temp4; // 캡슐화 원칙으로 private 사용
}
구분 | 해당 클래스 내부 | 같은 패키지 내 | 후손 클래스 내 | 전체 |
---|---|---|---|---|
public | O | O | O | O |
protected | O | O | O | O |
(default) | O | O | ||
private | O |
public > protected > default > private 순으로 범위가 작아짐!
-> 인스턴스 변수를 초기화 시키는 블럭으로 객체 생성시 마다 초기화
-> 초기화 블록은 조건문이나 반복문을 사용할 때 사용
💡💡 초기화블록은 어떤 생성자를 실행하든 다 실행됨 (기본생성자 or 매개변수가 있는 생성자)
//ex
public class Person {
public String name;
public int age;
public char gender;
public double height;
public Person() { // 생성자는 클래스와 이름이 동일함!
System.out.println("Person 기본 생성자 실행!");
name = "유병승";
age = 19;
height = 180.5;
gender = '남';
}
생성자 표현식 2가지
- (1) : [접근제한자] 클래스명() { } -> 기본생성자
- (2) : [접근제한자] 클래스명(매개변수) { (this.)필드명 = 매개변수; } -> 매개변수가 있는 생성자
this
: 자기 자신의 인스턴스를 나타냄
public class Academy {
private int studentNo;
private String name;
// 기본 생성자
public Academy() {}
//매개변수 있는 생성자
public Academy(int studentNo, String name) {
this.studentNo = studentNo;
this.name = name;
}
}
✅ 오버로딩 : 한 클래스 내에 동일한 이름의 메소드를 여러 개 작성하는 기법
조건
: 같은 메소드 이름 + 다른 매개변수의 개수 또는 다른 매개변수 타입
ex)
public person(){} // 기본생성자
public Person(String name, int age) { // Stirng, int 타입형 생성자(밑에와 다른것임)
this.name = name;
this.age = age;
}
public Person(int age, String name) { // int, Stirng 타입형 생성자 (위에와 다른것임)
this.name = name;
this.age = age;
}
public Person(String paramName, int paraAge, double paramHeight, char paramGender) { // String, int, double, char 타입 생성자
name = paramName;
age = paraAge;
height = paramHeight;
gender = paramGender;
}
// this() 생성자를 이용하면 추가로직을 작성하지 않고 활용할 수 있음.
// 생성자 내부에서 다른 생성자를 호출할 때 사용
public Person(String name, int age, char gender, String address) {
this(name,age); // this 생성자는 생성자 코드에 첫번째 줄에만 선언할 수 있다. (하나만 사용가능)
this.address = address;
this.gender = gender;
}
(1) : 수학의 함수와 비슷하며 호출을 통해 사용
(2) : 전달 값이 없는 상태로 호출하거나 어떤 값을 전달하여 호출
(3) : 함수 내에 작성된 연산 수행 후 반환 값/결과 값은 있거나 없을 수 있음
메소드의 접근 제한자 = 필드의 접근 제한자와 동일함
메소드 예약어
메소드 반환형
메소드 매개변수
메소드 선언방법
접근제한자 [예약어] 반환형 메소드명([매개변수선언]){기능구현}
💡 메소드의 접근 제한자는 대부분 public으로 함
💡 메소드명은 변수명이랑 명명규칙이 똑같음
(첫글자 소문자에 그 다음단어부터는 첫글자 대문자) = 카멜케이스 = 낙타표기법
ex) printMsg() , methodTest()
💡 반환형이 void가 아닌 경우 해당 타입에 맞는 return 값이 있어야함
1. 매개변수가 x + 리턴값 x
2. 매개변수가 o + 리턴값 x
3. 매개변수가 x + 리턴값 o
4. 매개변수가 o + 리턴값 o
// ex)
public void printMsg() { // 1. 반환형이 없고 매개변수도 없는 메소드 선언하기
System.out.println("printMsg 실행함");
}
public int plus() { // 2. 반환형이 있고 매개변수 없는 메소드 구현하기
int su = 100;
int su2 = 200;
return (su+su2); // 반환형을 처리하는 예약어를 사용 -> return 값 또는 변수
}
public void printSendMsg(String msg) { //3. 반환형이 없고 매개변수가 있는 메소드
System.out.println("전달한 메세지 : "+msg+" 실행함");
}
public int complexNumber(int su1, int su2) { //4. 반환형이 있고 매개변수 있는 메소드
return su1 * su2;
}
// MethodTest 클래스
public void numberTest() { // 메소드 내부에서는 반복문, 조건문 다 사용 가능함
this.count++; // 필드 카운트 (함수 호출할 때마다 누적되며 유지됨)
int count = 0; // 지역변수 카운트 (함수 호출할때마다 초기화)
for(int i=1; i<=10; i++) {
if(i%2== 0) {
System.out.print(i+" ");
}
}
System.out.println();
System.out.println("필드출력 : "+this.count);
System.out.println("지역변수 : "+this.count);
}
// main 클래스
public static void main(String[] args) {
// 클래스에 선언된 메소드 호출하기
// 클래스의 멤버메소드를 호출하려면 클래스를 객체로 생성해야함
MethodTest mt = new MethodTest();
mt.numberTest(); // 같은 주소로 호출함 필드 1 지역변수 1
mt.numberTest(); // 같은 주소로 호출함 필드 2 지역변수 1
mt.numberTest(); // 같은 주소로 호출함 필드 3 지역변수 1
new MethodTest().numberTest(); // (다른 주소로 호출함)주소가 새로 만들어짐 필드 1 지역변수 1
new MethodTest().numberTest(); // (다른 주소로 호출함)주소가 새로 만들어짐 필드 1 지역변수 1
new MethodTest().numberTest(); // (다른 주소로 호출함)주소가 새로 만들어짐 필드 1 지역변수 1
}
setter 메소드
-> 필드에 변경할 값을 전달 받아서 필드 값을 변경하는 메소드
getter 메소드
-> 필드에 기록된 값을 읽어서 요청한 쪽으로 읽은 값을 넘기는 메소드
💡 setter와 getter는 메소드를 만들 때 로직을 사용할 수 있음
자바빈 규약
private
로 선언되어야 한다getter
와 setter
메서드가 존재해야 한다.getter
와 setter
는 접근자가 public
으로 선언되어야 한다.// ex)
public void setDepartment(String department) { // setter 메소드 (매개변수가 있고, 반환형이 없음)
this.department = department;
}
public String getDepartment() { // getter 메소드 (매개변수가 없고 반환형이 있음)
return this.department;
}