new 할 때 딱 한 번 실행되는 초기화 함수 (클래스 이름과 똑같이 생겼고 리턴 타입이 없음)[암기 공식]
class 클래스명 { ... }
클래스명() { ... }← 생성자 (이름 똑같음!!)
void 메서드명() { ... }← 메서드
private으로 숨기고, 안전하게 값을 넣거나(set) 가져올 때(get) 사용합니다.[암기 공식]
Set:public void set변수명(타입 변수) { this.변수 = 변수; }
Get:public 타입 get변수명() { return 변수; }
[암기 공식]
class 자식클래스 extends 부모클래스 { ... }
( ) 사용.[암기 공식]
부모 p = new 자식();← 업캐스팅 (시험에 단골 출제)
자식 c = (자식)p;← 다운캐스팅 (강제로 깎아서 맞춤)
부모 클래스: 스마트폰
자식 클래스: 아이폰 (스마트폰의 기능을 다 물려받음 + '에어드롭' 같은 자기만의 기능도 있음)
① 업캐스팅 (자동): 당연한 소리 할 때
친구가 "너 폰 뭐 샀어?" 했을 때, 아이폰을 보여주며 "나 스마트폰 샀어"라고 말하는 상황이야.
아이폰은 당연히 스마트폰이니까 누가 태클을 걸지 않지? 그래서 자바에서도 에러 없이 '자동'으로 통과시켜 줘.
코드: 스마트폰 p = new 아이폰();
(아이폰을 만들어서 스마트폰이라는 상자에 넣음. 문제없음!)
② 다운캐스팅 (강제): 억지로 본성을 끌어낼 때
그런데 위에서 p를 '스마트폰'이라고 뭉뚱그려 불렀잖아? 그래서 p.에어드롭()을 쓰려고 하면 컴퓨터가 "어? 스마트폰에는 에어드롭 없는데?" 하고 에러를 내뿜어.
분명히 아이폰을 넣었지만, 겉포장지가 '스마트폰'이라서 자기 기능을 못 쓰는 거야.
이때 겉포장지를 찢고 "야! 얘 사실 아이폰이라고!!" 하고 강제로 도장을 찍어주는 게 다운캐스팅이야.
코드: 아이폰 c = (아이폰) p;
(p 앞에 괄호 치고 (아이폰)이라고 강제로 깎아 맞춰줌. 이제 에어드롭 사용 가능!)
abstract). "이런 기능은 꼭 있어야 해!"implements). "이 규칙을 무조건 지켜서 만들어!"[암기 공식]
추상:abstract class 클래스명/abstract void 메서드명();(내용 없음)
인터페이스:interface 이름/class 클래스명 implements 이름
① 추상클래스 (abstract) = 프랜차이즈 식당 물려주기
본사(부모)가 가맹점(자식)한테 가게를 내주는데, 기본적 인테리어나 포스기 쓰는 법(일반 기능)은 다 세팅해서 넘겨줘.
그런데 "비법 소스(추상 메서드)는 동네 입맛에 맞게 니가 알아서 연구해서 만들어!" 하고 빈칸을 남겨두는 거야.
특징: 기본 틀은 제공함. 일부만 "니가 완성해!" (abstract 키워드 사용)
② 인터페이스 (interface) = 백종원의 골목식당 규격서
도와주는 거 1도 없음. 오직 지켜야 할 '규칙 목록'만 종이에 적어서 던져줘.
"식당 할 거면 1. 주차장 만들어, 2. 위생 철저히 해, 3. 메뉴판 3개로 줄여."
이걸 어떻게 할지는 100% 자식(가맹점)이 바닥부터 다 짜야 해.
특징: 껍데기(이름)만 던져줌. 내용물은 100% 자식이 알아서 만들어야 함. (implements 키워드 사용)
[암기 공식]
try { 에러 날 것 같은 코드 }
catch (예외클래스 e) { 에러 나면 할 일 }
finally { 에러 나든 안 나든 무조건 실행 }
<T>나 <E>를 사용)[암기 공식]
ArrayList<String> list = new ArrayList<>();
(안에 들어갈 타입을< >안에 적어준다!)
[암기 공식]
class Outer { class Inner { ... } }
[암기 공식]
@Override스티커 붙이기! (부모 메서드와 이름, 매개변수가 똑같아야 함)
변수 숨기기: 클래스 안에 만드는 모든 변수(데이터) 앞에 무조건 private을 붙인다.
창구 만들기: 그 숨겨진 변수를 밖에서 안전하게 읽고 쓸 수 있도록, public으로 Getter와 Setter 메서드를 만들어 준다.
class Person {
// 1. 변수는 private으로 숨김 (캡슐화)
private String name;
// 2. 생성자 (클래스 이름과 똑같고 void 안 씀!)
public Person(String name) {
this.name = name; // 넘어온 값을 내 변수(this)에 넣음
}
// 3. Getter (값 가져오기, return 필수)
public String getName() {
return name;
}
// 4. Setter (값 집어넣기, void 사용)
public void setName(String name) {
this.name = name;
}
}
// 1. 부모 클래스
class Animal {
void sound() {
System.out.println("동물 소리");
}
}
// 2. 자식 클래스 (extends로 부모 기능 물려받음)
class Dog extends Animal {
// 3. 오버라이딩 (부모 메서드 덮어쓰기)
@Override
void sound() {
System.out.println("멍멍");
}
}
public class Main {
public static void main(String[] args) {
// 4. 다형성 (업캐스팅): 부모 타입에 자식 객체 넣기
Animal a = new Dog();
a.sound(); // 자식이 덮어쓴 "멍멍"이 출력됨
// 5. 다운캐스팅: 다시 자식 타입으로 깎아서 맞춤
Dog d = (Dog) a;
}
}
// 1. 인터페이스 (규격서 - 내용물 없이 선언만)
interface Flyable {
void fly();
}
// 2. 인터페이스 구현 (implements 사용, 무조건 오버라이딩 필수)
class Bird implements Flyable {
@Override
public void fly() {
System.out.println("새가 납니다");
}
}
import java.util.ArrayList; // 리스트 쓰려면 임포트 필수
public class Main {
public static void main(String[] args) {
// 3. 제네릭 (ArrayList 꺾쇠 < > 안에 타입 넣기)
ArrayList<String> list = new ArrayList<>();
list.add("합격");
// 4. 예외처리 (에러 방어막)
try {
int result = 10 / 0; // 에러 터지는 코드
} catch (Exception e) {
System.out.println("에러 발생!"); // 에러 나면 여기 실행
} finally {
System.out.println("무조건 실행됨"); // 무조건 마지막에 실행
}
}
}
// 1. 추상클래스 (abstract: 미완성 설계도)
abstract class Shape {
// 내용물 {} 이 없는 미완성 메서드
abstract void draw();
}
// 2. 자식 클래스 (추상클래스는 무조건 자식이 완성해줘야 함!)
class Circle extends Shape {
@Override
void draw() {
System.out.println("동그라미 그리기");
}
}
// 3. 내부클래스 (클래스 안의 클래스)
class Outer {
int outVar = 10;
// 껍데기 안에 들어있는 이너 클래스
class Inner {
void print() {
System.out.println("바깥 변수 사용: " + outVar);
}
}
}
public class Main {
public static void main(String[] args) {
// 1. 배열 만들기 (데이터를 기차 칸처럼 여러 개 담는 통)
int[] scores = {80, 90, 100};
int sum = 0; // 합계를 담을 빈 바구니
// 2. 반복문 (배열 크기만큼 빙글빙글 돌기)
// i는 0부터 시작해서 배열의 길이(scores.length) 전까지 증가(i++)
for (int i = 0; i < scores.length; i++) {
sum = sum + scores[i]; // 바구니에 점수를 계속 누적해서 더함
System.out.println(scores[i] + "점 출력!");
}
// 3. 결과 출력
System.out.println("총합은: " + sum);
}
}
<T>를 쓴다.// 1. 제네릭 클래스 설계 (<T>는 '타입은 나중에 정할게!'라는 빈칸입니다)
class Box<T> {
private T item; // 타입이 T인 변수
// Setter
public void setItem(T item) {
this.item = item;
}
// Getter
public T getItem() {
return item;
}
}
public class Main {
public static void main(String[] args) {
// 2. 객체 만들 때 < > 안에 진짜 타입(String, Integer 등)을 넣어줌
Box<String> stringBox = new Box<>();
stringBox.setItem("문자열 합격!");
Box<Integer> intBox = new Box<>();
intBox.setItem(100); // 숫자 100
}
}
class Parent {
void show() {
System.out.println("부모 기능");
}
}
class Child extends Parent {
@Override
void show() {
System.out.println("자식이 덮어쓴 기능");
}
void onlyChild() {
System.out.println("자식한테만 있는 특별한 기능");
}
}
public class Main {
public static void main(String[] args) {
// [공식 1] 자동 타입 변환 (업캐스팅)
// 자식 객체를 만들어서 부모 변수(p)에 담음
Parent p = new Child();
p.show(); // "자식이 덮어쓴 기능" 출력됨
// [공식 2] 강제 타입 변환 (다운캐스팅)
// p.onlyChild(); // 에러 발생! 부모 껍데기라 자식 전용 버튼이 안 보임
// 다시 자식 타입으로 (Child)라고 써서 강제로 깎아줌!
Child c = (Child) p;
c.onlyChild(); // 이제 자식 전용 기능 실행 가능!
}
}
이모티콘을 모두 제거하고, 복습이나 블로그(Velog) 포스팅에 바로 활용하실 수 있도록 깔끔한 평서문(-한다 체) 형식으로 다시 정리해 드립니다.
자바에서 문자열을 다룰 때 빈번하게 사용되는 필수 내장 함수들을 목적별로 정리한다. 코딩 테스트나 실기 시험에서 코드의 빈칸 채우기 또는 출력 결과 예측 문제로 자주 출제되므로 각 함수의 역할을 정확히 숙지해야 한다.
length(): 문자열의 총 길이를 정수(int)로 반환한다."Java".length() 실행 시 4 반환charAt(int index): 지정한 인덱스 번호에 위치한 문자(char) 하나를 반환한다. 자바의 인덱스는 0부터 시작한다."Java".charAt(1) 실행 시 'a' 반환substring(int beginIndex, int endIndex): 문자열의 특정 구간을 잘라서 반환한다. 시작 인덱스부터 끝 인덱스 '직전'까지만 잘라낸다는 점에 주의해야 한다.split(String regex): 특정 기호나 문자를 기준으로 문자열을 쪼개어 String 배열 형태로 반환한다."010-1234-5678".split("-") 실행 시 배열 ["010", "1234", "5678"] 반환indexOf(String str): 특정 단어나 문자가 시작되는 첫 번째 위치의 인덱스 번호를 반환한다.replace(CharSequence target, CharSequence replacement): 특정 문자열을 찾아 다른 새로운 문자열로 모두 교체한다. replaceAll(), 처음 발견된 패턴 하나만 교체할 때는 replaceFirst()를 사용한다.trim(): 문자열의 양 끝에 있는 공백을 모두 제거한다. (문자열 중간에 포함된 띄어쓰기는 제거하지 않음)equals(Object anObject): 두 문자열의 값이 완전히 동일한지 비교하여 참/거짓을 반환한다. 자바에서는 문자열의 값을 비교할 때 == 연산자를 사용하면 주소값을 비교하게 되므로, 반드시 equals() 메서드를 사용해야 한다.contains(CharSequence s): 문자열 안에 특정 단어나 문자가 포함되어 있는지 확인한다.startsWith(String prefix): 문자열이 특정 문자로 시작하는지 확인한다.endsWith(String suffix): 문자열이 특정 문자로 끝나는지 확인한다.