1. 클래스
클래스
- 클래스: 데이터와 기능을 포함하는 코드 묶음, 설계도 역할
- 객체: 클래스로부터 만들어진 실체
- 종이접기 책이 클래스라면, 책을 보고 만든 종이학이 객체
- class 클래스명{
}
// 클래스 Person
class Person {
}
// 클래스 Person으로 만든 객체 p
public static void main(String[] args) {
Person p = new Person(); // 새로운 객체를 만들기 위해서 new 키워드를 쓰고 클래스명();
}
인스턴스 변수
- 인스턴스 변수: 클래스 내에 선언된 변수
- class 클래스명{
인스턴스 변수1 ...
} - 변수명 뒤에 점(.)으로 인스턴스 변수에 접근 가능
- 객체마다 서로 다른 값을 가질 수 있음
// 클래스 - 인스턴스 변수
class Person {
String name; // 인스턴스 변수
int age; // 인스턴스 변수
}
// 객체 - 인스턴스 변수 선언
public static void main(String[] args) {
Person p = new Person(); // 객체
p.name = "철수"; // 인스턴스 변수
p.age = 20; 인스턴스 변수
}
클래스 변수
- 클래스 변수: 클래스 내에 static으로 선언된 변수
- 쉽게 말해 모든 객체가 공유하는 변수를 말함
- class 클래스명{
static 클래스 변수1 ...
} - 객체를 만들 필요 없이 클래스명으로 접근 가능
- 클래스명 뒤에 점(.)으로 클래스 변수에 접근 가능
// 클래스 - 클래스 변수
class Person {
String name; // 인스턴스 변수
int age; // 인스턴스 변수
static int personCount = 0; // 클래스 변수(사람의 수를 카운트)
}
// 클래스 변수는 객체를 만들 필요 없이 클래스명으로 바로 접근 가능
public static void main(String[] args) {
Person.personCount = 10; // 클래스명.클래스변수명
System.out.println(Person.personCount); // 10
}
인스턴스 메소드
- 인스턴스 메소드: 클래스 내에 정의된 메소드
- class 클래스명{
인스턴스 메소드1 ...
} - 객체명 뒤에 점(.)으로 인스턴스 메소드 호출
// 클래스 - 인스턴스 메소드
class Person {
String name; // 인스턴스 변수
int age; // 인스턴스 변수
static int personCount = 0; // 클래스 변수
public void introduce() { // 인스턴스 메소드: introduce
System.out.println("이름: " + name);
System.out.println("나이: " + age);
}
}
// 인스턴스 메소드 호출
public static void main(String[] args) {
Person p = new Person(); // 객체 생성
p.name = "철수"; // p.인스턴스 변수
p.age = 20; // p.인스턴스 변수
p.introduce(); // p.인스턴스 메소드 호출
}
/* 실행결과:
이름: 철수
나이: 20 */
클래스 메소드
- 클래스 메소드: 클래스 내에 static으로 정의된 메소드
- class 클래스명{
static 클래스 메소드1 ...
} - 클래스명 뒤에 점(.)으로 클래스 메소드 호출
// 클래스 - 클래스 메소드
class Person {
String name; // 인스턴스 변수
int age; // 인스턴스 변수
static int personCount = 0; // 클래스 변수
public static void printPersonCount() { // 클래스 메소드
System.out.println(personCount);
}
}
// 클래스명을 통해서 클래스 메소드 호출
public static void main(String[] args) {
Person.personCount = 10; // 클래스 변수
Person.printPersonCount(); // 클래스 메소드 호출
}
// 실행결과: 10
This
- This: 자기 자신 (클래스 내에서 인스턴스 or 지역 변수를 구분하기 위해 사용함)
- this.인스턴스변수;
// 클래스 - This
class Person {
String name; // 인스턴스 변수
public void setName(String name) { // 메소드: setName (전달값: String name)
this.name = name;
// Person 클래스 내 name 변수와 setName 메소드 내 전달값 name 구분하기 위해 this.을 붙임
// this.name은 Person 클래스의 name을 가리키게 됨
// this 없이 그냥 name을 쓰게 되면 setName 메소드 내 전달값 name을 가리키게 됨
}
}
// This
public static void main(String[] args) {
Person p = new Person(); // 객체 p
p.setName("철수");
System.out.println(p.name);
}
// 실행결과: 철수
생성자
- 생성자: 객체가 생성될 때 호출되는 메소드
- class 클래스명(전달값){
초기화 명령
}
// 클래스 - 생성자
class Person { // Person 클래스
String name; // 인스턴스 변수
int age; // 인스턴스 변수
Person(String name, int age) { // Person 메소드(전달값)
this.name = name; // 초기화 작업
this.age = age; // 초기화 작업
}
}
// 객체 - 생성자
public static void main(String[] args) {
Person p = new Person("철수", 20); // String name에 "철수", age에 20이 대입됨
}
Getter & Setter
- Getter: 인스턴스 변수의 값을 반환해 주는 메소드
- 반환형 get이름(){
return 반환값;
}
- 반환형 get이름(){
- Setter: 인스턴스 변수의 값을 설정해 주는 메소드
- void set이름(전달값){
}
- void set이름(전달값){
// Getter: 인스턴스 변수의 값을 반환
class Person {
int age; // 인스턴스 변수
public int getAge() { // 반환형: int, get이름(): getAge()
return age; // 반환값: age
}
}
// Setter: 인스턴스 변수의 값을 설정
class person {
int age; // 인스턴스 변수
public void setAge(int age) { // void set이름(전달값): setAge(int age)
this.age = age;
}
}
// Getter & setter
public static void main(String[] args) {
Person p = new Person(); // p 객체
p.setAge(20); // 객체.setAge를 통해 값 설정(setter 메소드 이용)
System.out.println(p.getAge()); // 객체.getAge를 통해 값 가져오기(getter 메소드 이용)
}
접근 제어자
- 접근 제어자: 접근 권한 지정
- 접근 제어자 class 클래스명{
접근 제어자 인스턴스 변수 or 메소드
}
접근 제어자의 종류 | 접근 가능 범위 |
private | 해당 클래스 내에서만 |
public | 모든 클래스에서 |
default | 같은 패키지 내에서만 (아무것도 적지 않았을 때 default 적용) |
protected | 같은 패키지 내에서 or 다른 패키지인 경우 자식 클래스에서 |
// 접근 제어자 예시
class Person {
private int age; // 'private' 접근 제어자
public int getAge() { // 'public' 접근 제어자
return age;
}
}
패키지
- 패키지: 관련 클래스 or 인터페이스들을 그룹화 하는 것
- package 패키지명;
- 패키지를 폴더 구조와 비교해 보았을 때 다음과 같이 비교해 볼 수 있음
- package sample 안에 class MyClass가 있다!
- 다른 패키지에 있는 클래스를 사용하기 위해서는 'import'
- import 패키지명.클래스명;
- import java.util.Random;
- java 패키지 밑에 util 패키지 밑에 Random 클래스를 사용하고자 할 때
- 패키지 내 여러 클래스를 사용하는 경우: *
- import 패키지명.*
- import java.util.*;
- import 패키지명.클래스명;
// import package
import java.util.Random;
public class MyClass {
public static void main(String[] args) {
Random random = new Random(); // Random 클래스는 import를 해 왔기 때문에 사용 가능
int num = random.nextInt();
}
}
상속
- 상속: 특정 클래스의 기능을 재사용 및 확장하는 것
- 부모 클래스: 특정 클래스
- 자식 클래스: 재사용 및 확장하는 클래스
- 부모 클래스에 있는 기능은 상속하고, 없는 기능만 새롭게 구현하면 됨
- class 자식 클래스명 extends 부모 클래스명{
}
// 상속
calss Student extends Person { // 부모클래스: Person, 자식클래스: Student
String school; // 자식클래스에서 새로운 기능 구현: String school;
}
메소드 오버라이딩
- 메소드 오버라이딩: 부모 클래스의 메소드를 재정의하는 것(부모 클래스의 메소드 덮어쓰기)
// 메소드 오버라이딩
class Person { // 부모 클래스: Person
public void introduce() { // Person 객체 생성시 inroduece 메소드 호출하면
System.out.println("사람입니다");
}
}
class Student extends Person { // 자식 클래스: Student
public void introduce() { // Student 객체 생성시 inroduece 메소드 호출하면
System.out.println("학생입니다");
}
}
다형성
- 다형성: 여러 형태로 동작할 수 있는 성질
- public static void main(String[] args) {
Person person = new Person(); // person 객체
Person student = new Student(); // student 객체
person.introduce(); // 사람입니다
student.introduce(); // 학생입니다
}- main 메소드에서 객체를 만들 때 앞쪽에는 모두 Person 클래스를 적음
- 뒤쪽에서는 new Person();, new Student(); 서로 다른 객체를 만듦
- 서로 다른 객체지만 부모 클래스인 Person로 똑같이 참조할 수 있음 => 다형성
// 메소드 오버라이딩
class Person { // 부모 클래스: Person
public void introduce() { // Person 객체 생성시 inroduece 메소드 호출하면
System.out.println("사람입니다");
}
}
class Student extends Person { // 자식 클래스: Student
public void introduce() { // Student 객체 생성시 inroduece 메소드 호출하면
System.out.println("학생입니다");
}
}
// 다형성
public static void main(String[] args) {
Person person = new Person(); // person 객체
Person student = new Student(); // student 객체
person.introduce(); // 사람입니다
student.introduce(); // 학생입니다
}
Super
- Super: 부모 클래스에 접근하기 위해 사용
- super.부모 클래스 변수;
- super.부모 클래스 메소드();
- super();
// 부모 클래스: Person
class Person {
int age; // 인스턴스 변수
Person(int age) { // 생성자
this.age = age;
}
}
// 자식 클래스: Student
class Student extends Person {
String school;
Student(int age, String school) { // 생성자
super(age); // 부모 클래스에 있는 age 생성자를 super로 불러옴
this.school = school;
}
}
참조
- 참조: 객체의 메모리 주소를 가리키는 것
- 기본 자료형을 제외한 모든 자료형은 참조 자료형
- 클래스, 인터페이스, 배열, 열거형 ... (String)
Final
- Final: 변경할 수 없게 쓰는 키워드
- 변경할 수 없게 만들기 때문에 '초기값'을 반드시 설정해 주어야 함
// Final
class Person {
final String name = "철수"; // final: name 값은 절대 바꿀 수 없는 변수가 되는 것
// 절대 바꿀 수 없기 때문에 '초기값'을 설정해 주어야 하는 특징이 있음
public final void introduce() { // final: introduce 메소드를 절대 새롭게 정의할 수 없음
// Student 자식 클래스에서 introduce 메소드 오버라이딩 불가
System.out.println("사람입니다.");
}
}
열거형
- 열거형: 특수한 형태의 클래스로 상수들의 묶음
- enum 열거형명{
상수명1 ...
} - switch문에서 유용하게 사용할 수 있음
// 열거형 - 성별 정의
enum Gender {
MALE,
FEMALE
}
// Person 클래스
class Person {
Gender gender; // 열거형명과 변수명
public void setGent(Gender gender) {
this.gender = gender;
}
}
// main 메소드
public static void main(String[] args) {
Person person = new Person();
person.setGender(Gender.MALE); // MALE
switch (person.gender) {
case MALE: System.out.println("남자"); break;
case FEMALE: System.out.println("여자"); break;
}
}
참고 영상: 나도코딩 - 자바 무료 강의 2시간 완성(1분 자바)
https://youtu.be/DNCBaeCoMug?si=VM02QD9igeT561pp
반응형