Java/Java 수강일지

[수강일지_16] 복습, 추상클래스 , interface , variavle, static, staticmethod, final

jamk-diary 2026. 6. 1. 16:35
14일차 복습 study

package main;

 

public class MainClass {

 

public static void main(String[] args) {

/*

객체지향 3대 요소

1->2-> 3-> 4-> 5

 

절차지향 -> 순서지향 = 첫번째 작업 진행 후 두번째 작업 실행

객체지향이란 -> 객체를 중시하여 처리를 중심으로 진행

-> 1,2,3,4,5

 

3대요소

은닉성 , 상속성 , 다형성

 

캡슐화

멤버 변수 +멤버함수 -> 전부 Class 안에서 캡슐식 (묶어주는 것 )

 

은닉성

현재 클래스의 외부로부터 접근을 제어하는 것

getter,setter

 

Constructor : 생성자 -> 초기값

->초기값을 설정 / 초기화와는 다름, 다시 호출할 수 있다

MyClass mycls1 = new MyClass();

// int number = 0;

MyClass mycls2 = new MyClass("홍길동", 1001);

 

🏛️ 테마 1: 상속과 다형성 (부모-자식 설계도)

상속성

부모 클래스에서 상속 (variable, method)을 받는 것을 의미

over ride -> 상속받은 메소드를 고쳐 기입하는 것

① 상속 (extends)

  • 개념: 부모가 가진 재산(변수)과 기술(메서드)을 자식에게 그대로 물려주는 거예요.
  • 비유: 백종원 씨(부모)가 평생 개발한 '비법 양념장 소스 공식'을 아들(자식)에게 물려준 상황이에요. 아들은 아무것도 안 해도 그 소스를 자기 가게에서 바로 쓸 수 있죠!
  • 코드 특징: class Child extends Parent라고 적으면 부모의 능력을 다 물려받아요. 만약 부모 소스가 맘에 안 들면 자식이 자기 입맛대로 고쳐 쓸 수 있는데, 그걸 오버라이딩(Override, 재정의)이라고 불러요.

 

다형성

부모클래스의 instance(객체)를 사용해서 자식 클래스의 객체를 생성하는 것

Parent par = new Child();

 

Animal dog = new Dog();

Animal cat = new Cat();

Animal cow = new Cow();

why? 자식 클래스의 다양한 객체를 하나의 객체형으로 관리하기 위함

 

dog.method() -> 자식 클래스에서 over ride 된 메소드가 호출

Dog d = (Dog)dog;

d.func() -> 자식 클래스에만 있는 메소드

 

어떤 객체인지 확인할 수 있는 키워드 -> instanceof

 

why? -> 다양한 객체를 하나의 객체형으로 관리하기 위함

 

Object dog = new Dog();

Object cat = new Cat();

Object cow = new Cow();

 

② 다형성 (Parent p = new Child();)

  • 개념: 부모의 이름표(타입)로 자식 객체를 만들어 내는 마법이에요.
  • 비유: 마트에서 "동물 상자(부모)"를 하나 사 왔어요. 이 상자 안에는 강아지(new Dog()), 고양이(new Cat()), 송아지(new Cow())를 다 담을 수 있죠.
  • 왜 쓸까? 강아지 상자, 고양이 상자 따로따로 만들면 관리하기 귀찮잖아요? "동물(부모) 상자 하나만 준비해! 자식들은 내가 다 한꺼번에 담아서 관리할게!" 이게 바로 다형성이에요.

 

*/

}

}

 

class MyClass{

String name;

int number;

 

public MyClass() {

name = "";

number = 0;

}

public MyClass(String name, int number) {

this.name = name;

this.number = number;

}

 

void method() {

}

}

 

class Human{

private String name;

private int age;

 

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

 

public void info() {

 

}

}

 

class Parent{

private int num;

protected String name;

 

public Parent() {

}

public Parent(int num) {

super();

this.num = num;

}

 

public void par_method() {

}

 

public void method() {

 

}

}

 

class Child extends Parent{

 

public Child() {

//super();

super(1);

}

public void func() {

name = "임소리";

par_method();

 

super.method();

this.method();

}

 

public void method() { // <- Over Ride

 

}

}


Sample 44 
Sample 44-MainClass

package mian;

 

import cls.AbstractClass;

 

public class MainClass {

public static void main(String[] args) {

/*

abstract class : 추상 클래스

추상 메소드를 하나이상 보유하고 있는 클래스

abstract method : 추상함수

내용(처리)는 없고 사양(proto type)만 선언되어 있는 함수

🏗️ 테마 2: 추상 클래스 (abstract class)
  • 개념: 구체적인 내용은 없고 말 그대로 '추상적인 틀'만 잡아둔 뼈대 클래스예요.
  • 비유: 나라에서 건설사들한테 "앞으로 신도시 아파트 지을 때 '독서실 공간(추상 메서드)'은 무조건 하나 이상 만들어라! 근데 인테리어를 어떻게 채울지는 건설사 너네가 알아서 해!" 하고 가이드라인(사양)만 툭 던져준 거예요.

 

일반 메소드 형식

public void method(int i, String str) {

처리

 

추상 메소드 형식

public abstract void method(int i, String str);

(빈통을 딱 주고 나서 채우는 건 당신이 알아서 해_

코드 특징:
  • public abstract void abstractMethod(); 처럼 몸통({})이 없고 세미콜론(;)으로 끝나요. 알맹이가 비어있는 빈 통이죠!
  • 이걸 상속받은 자식 클래스(Circle, Rectangle)는 무조건 에러가 뜨면서 "빨리 부모가 비워둔 추상 메서드 안쪽을 채워 넣어라!" 하고 강제당하게 됩니다. 원은 원의 넓이 공식으로, 사각형은 사각형 공식으로 알맹이를 채우는 거죠!

 

 

*/

 

//추상 클래스는 아래 형식 처럼 바로 생성하는 것이 불가

//AbstractClass ac = new AbstractClass();

 

//1.상속 후 추상 메소드를 정의한 클래스를 생성한다

// MyClass mycls = new MyClass();

// mycls.abstractmethod();

// mycls.method();

 

// //2. instance 는 부모 클래스의 instancefh 로 생성이 가능하다

// AbstractClass ac = new Myclass();

// ac.abstractmethod();

// ac.method();

//

// 3. 생성과 동시에 정의하면 사용이 가능

// Android

AbstractClass ac = new AbstractClass() {

@Override

public void abstractMethod() {

System.out.println("AbstractClass abstractMethod()");

}

};

ac.abstractMethod();

ac.method();

 

 

}

}

 

Sample - MyClass

package cls;

 

public class MyClass extends AbstractClass {

// MyClass 밑에 에러 떴을 때 소스 -> 오버라이드 들어가서 생성하기

//재정의 하는 과정

 

@Override

public void abstractMethod() {

System.out.println("MyClass abstractMethod()");

}

}

Sample 44 -AbstractClass

package cls;

 

public abstract class AbstractClass {

 

private String name;

 

public abstract void abstractMethod();

 

public void method() {

System.out.println("AbstractClass method()");

}

}

Sample 44 -출력결과

AbstractClass abstractMethod()

AbstractClass method()


Sample 45

 

Sample 45-MainClass
package main;

import cls.Circle;
import cls.Rectangle;
import cls.Shape;

public class MainClass {
public static void main(String[] args) {

// 원의 넓이
Shape circle = new Circle(3);
circle.display();
System.out.println(circle.getArea());

Shape rect = new Rectangle(4, 6);
rect.display();
System.out.println(rect.getArea());

}
}
Sample 45-Shape
package cls;
//추상 클래스는 클래스 앞에 항상 abstract 붙이기
public abstract class Shape {

public abstract double getArea();
public void display() {
System.out.println(" 도형의 넓이 구한다 ");
}


}
Sample 45-
\Circle 

 

package cls;


public class Circle extends Shape {


private double radius;

public Circle(double radius) {
super();
this.radius = radius;
}

//유징으로 생성자 만들기
@Override
public double getArea() {
return radius * radius * Math.PI;
}




@Override // 오버라이딩 겟 에리어만


public void display() {
System.out.println("원의 넓이입니다");
}
}
Sample 45-Rectangle

package cls;

 

public class Rectangle extends Shape {

 

private double width, height;

 

public Rectangle(double width, double height) {

super();

this.width = width;

this.height = height;

}

 

@Override

public double getArea() {

return width * height;

}

 

@Override

public void display() {

System.out.println("사각형의 넓이입니다");

}

}

Sample 45-Shape 

package cls;

//추상 클래스는 클래스 앞에 항상 abstract 붙이기

public abstract class Shape {

 

public abstract double getArea();

public void display() {

System.out.println(" 도형의 넓이 구한다 ");

}

 

}

 

Sample 45-출력결과

AbstractClass abstractMethod()

AbstractClass method()


 

 

Sample 46

 

Sample 46-MainClass

package main;

 

import cls.HeClass;

import cls.MyClass;

import inter.Myinterface;

 

 

public class MainClass {

public static void main(String[] args) {

/*

abstract class

abstract method + method + variable

(추상 메소드) (일반메소드) (멤버변수)

다중상속 불가능

interface

abstract method 로만 구성되어 있다 = 완전 빈통

다중 상속 가능

클래스 구현의 설계 또는 구성을 할 때 사용한다

확장성에 우수하다

🕸️ 테마 3: 인터페이스 (interface)

화면 아래쪽의 HeClass, MyInterface 부분이 이 내용이에요! 추상 클래스보다 한 단계 더 나아간 녀석입니다.
  • 개념: 일반 메서드나 변수는 일절 못 들어가고, 오직 100% 비어있는 '추상 메서드'로만 이루어진 완벽한 설계도(스펙)예요.
  • 비유: 스마트폰 충전 단자 규칙인 C타입 규격과 같아요. 삼성, 애플, 샤오미가 스마트폰 속 부품은 다 다르게 만들더라도, 충전 구멍만큼은 나라에서 정한 C타입 인터페이스 규칙을 구현(implements)해서 만들어야 전 세계 충전기가 다 호환되겠죠?

*/

// interface 만으로 생성이 안됨

// MyInterface mi = new MyInterface();

코드 특징:
  • 클래스 대신 interface 인터페이스명이라고 써요.
  • 자식 클래스가 이 규칙을 따를 때는 상속(extends)이라는 표현 대신 "이 규칙을 우리 클래스에 구현하겠다!" 라는 뜻으로 implements라는 키워드를 씁니다!
  • 자바는 원래 부모를 한 명밖에 못 두는데(다중 상속 불가), 인터페이스만큼은 규칙이니까 여러 개를 동시에 다중 상속(구현)할 수 있어요! (implements A, B 가능!)

 

/*

MyClass my = new MyClass();

my.abMethod();

 

MyInterface myi = new MyClass();

myi.abMethod();

 

MyInterface myinter = new MyInterface() {

@Override

public void abMethod() {

System.out.println("MyInterface abMethod()");

}

};

myinter.abMethod();

*/

 

 

HeClass he = new HeClass();

he.abMethod();

he.youfunc();

 

Myinterface myi = new HeClass();

myi.abMethod();

 

}

}

/*상속 클래스

class Father {

 

}

class Mother{

 

}

// Java 는 다중 상속이 불가하다

//다중 상속이란? 부모 클래스를 여러개 만들어서 자식 클래스가 부모 클래스 두 개를 다 상속 받게 하는 것

class Child extends Father,Mother { //<-다중 상속이 불가능!

 

}

*/

Sample 46- HeClass

package cls;


import inter.Myinterface;
import inter.Youlnterface;


public class HeClass implements Myinterface, Youlnterface {

@Override
public void youfunc() {
System.out.println("HeClass youfunc");
}

@Override
public void abMethod() {
System.out.println("HeClass abMethod");
}
}

Sample 46- myClass ( 규칙판을 가져와서 지키겠다고 선언)

package cls;

 

 

import inter.Myinterface;

 

public class MyClass implements Myinterface{

 

@Override// MyClass 에러 밑에 가져다 대고 add 누르면 자동 생성

public void abMethod() {

System.out.println("MyClass abMethod()");

}

}

//인터페이스 때는 이렇게 적어야 함 -> 시행하다:implements

Sample 46- Myinterface

package inter;

 

public interface Myinterface {

//Class 위치에 interface 가 있을 뿐 클래스와 차이는 없다

 

/*

[interface특징 ]

 

1. 변수 선언이 불가하다

private int number;

 

2.일반 메소드 선언 불가

public void method() {

 

}

*/

 

//추상 메소드로만 이루어져 있다.

public void abMethod();

}

Sample 46- Youinterface

 

package inter;

 

public interface Youlnterface {

 

public void youfunc();

}

Sample 46-출력결과

HeClass abMethod

HeClass youfunc

HeClass abMethod


student
student- Main Class

 

package main;

import java.util.Scanner;

import dao.StudentDao;
import dao.StudentDaoMpl;


public class Main {

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

// 학생정보 관리 클래스
// menu 위에 생성하는 이유 : 
StudentDao dao = new StudentDaoMpl();

// menu 구성하기 

//1. 무한으로 돌려주기 -> while이 정석 
while(true) {
System.out.println();
System.out.println(">>>>>>>>>>학생정보 프로그램 >>>>>>>>>>>");
System.out.println("1. 학생정보 추가");
System.out.println("2. 학생정보 삭제");
System.out.println("3. 학생정보 검색");
System.out.println("4. 학생정보 수정");
System.out.println("5. 모두 출력");
System.out.println("6. 과목 1등");
System.out.println("7. 점수의 총점과 평균 ");


//입력받을 부분 생성 
Systehttp://m.out.print("작업 >> ");
int work = sc.nextInt();

switch(work) {
case 1:
dao.insert(); //dao를 통해서 insert 가 나오게 해 준다 
break;
case 2:
dao.delete();
break;
case 3:
dao.select();
break;
case 4:
dao.update();
break;
case 5:
dao.allprint();
break;
case 6:
dao.top();
break;
case 7:
dao.sum_avg();
break;
}
}

}

}

Student-StudentDto

 

 

package dto;

 

//Data Transfer Object

//Dto = data transfer object

//기본 생성자 만들고 using , getter setter, to string 만들면 Dto 완성

public class StudentDto {

 

private String name;

private int age;

private double height;

private int kor;

private int eng;

private int math;

 

//첫번째 기본생성자 만들기

public StudentDto() {

}

 

//Source -> using 들어가서 생성

public StudentDto(String name, int age, double height, int kor, int eng, int math) {

this.name = name;

this.age = age;

this.height = height;

this.kor = kor;

this.eng = eng;

this.math = math;

}

 

//setter and getter

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;

}

 

public double getHeight() {

return height;

}

 

public void setHeight(double height) {

this.height = height;

}

 

public int getKor() {

return kor;

}

 

public void setKor(int kor) {

this.kor = kor;

}

 

public int getEng() {

return eng;

}

 

public void setEng(int eng) {

this.eng = eng;

}

 

public int getMath() {

return math;

}

 

public void setMath(int math) {

this.math = math;

}

 

@Override

public String toString() {

return "StudentDto [name=" + name + ", age=" + age + ", height=" + height + ", kor=" + kor + ", eng=" + eng

+ ", math=" + math + "]";

}

 

}

 

Student-StudentDaoClass

package dao;

 

public interface StudentDao {

 

public void insert();

public void delete();

public void select();

public void update();

public void allprint();

 

public void top();

public void sum_avg();

}

 

 

Student-StudentDtompl Class

package dao;

 

import java.util.Scanner;

 

import dto.StudentDto;

 

// Data Access Object

public class StudentDaoMpl implements StudentDao{

 

Scanner sc = new Scanner(System.in);

 

private StudentDto students[] = { // dummy data

new StudentDto("홍길동", 24, 172.1, 90, 80, 85),

new StudentDto("성춘향", 15, 154.3, 90, 90, 95),

new StudentDto("일지매", 22, 180.2, 85, 75, 90),

};

private int count;

 

public StudentDaoMpl() {

//students = new StudentDto[10];

count = 3;

}

 

@Override

public void insert() {

System.out.println("학생정보 추가 >>");

 

System.out.print("이름 = ");

String name = sc.next();

 

System.out.print("나이 = ");

int age = sc.nextInt();

 

System.out.print("키 = ");

double height = sc.nextDouble();

 

System.out.print("국어 = ");

int kor = sc.nextInt();

 

System.out.print("영어 = ");

int eng = sc.nextInt();

 

System.out.print("수학 = ");

int math = sc.nextInt();

 

students[count] = new StudentDto(name, age, height, kor, eng, math);

count++;

}

 

@Override

public void delete() { // 이름 -> "", 나이 -> 0

System.out.println("학생정보 삭제입니다");

 

int index = search();

 

if(index == -1) {

System.out.println("학생정보를 찾을 수 없습니다");

}else {

students[index].setName("");

students[index].setAge(0);

students[index].setHeight(0.0);

students[index].setKor(0);

students[index].setEng(0);

students[index].setMath(0);

 

System.out.println("학생정보를 삭제하였습니다");

}

}

 

@Override

public void select() { // 이름 -> 출력

System.out.println("학생정보를 검색합니다");

// 이름입력

System.out.print("이름 = ");

String name = sc.next();

 

// 배열 -> index

int index = -1;

for (int i = 0; i < students.length; i++) {

if(name.equals(students[i].getName())){

index = i;

break;

}

}

 

if(index == -1) {

System.out.println("학생정보를 찾을 수 없습니다");

}

else {

System.out.println(students[index].toString());

}

}

 

@Override

public void update() { // 이름 -> 수정: 국어, 수학, 영어

System.out.println("학생정보 수정입니다");

 

int index = search();

 

if(index == -1) {

System.out.println("학생정보를 찾을 수 없습니다");

return;

}

 

System.out.println("수정할 데이터를 입력해 주세요");

System.out.print("국어 = ");

int kor = sc.nextInt();

 

System.out.print("영어 = ");

int eng = sc.nextInt();

 

System.out.print("수학 = ");

int math = sc.nextInt();

 

students[index].setKor(kor);

students[index].setEng(eng);

students[index].setMath(math);

 

System.out.println("데이터를 수정하였습니다");

}

 

@Override

public void top() {

System.out.println("과목에 대한 top 점수와 학생명을 출력합니다");

 

System.out.print("원하는 과목의 번호입력(국어(1),영어(2),수학(3)) = ");

int number = sc.nextInt();

 

if(number == 1) { // 국어

int max = students[0].getKor();

for (int i = 0; i < students.length; i++) {

if(students[i].getKor() > max) {

max = students[i].getKor();

}

}

 

for (int i = 0; i < students.length; i++) {

if(max == students[i].getKor()) {

System.out.print("국어의 최고 점수는 " + max + "이고 ");

System.out.println("학생의 이름은 " + students[i].getName() + "입니다");

}

}

}

else if(number == 2) { // 영어

 

}

else if(number == 3) { // 수학

 

}

}

 

@Override

public void sum_avg() {

System.out.println("학생점수의 총점과 평균입니다");

for (int i = 0; i < students.length; i++) {

int sum = students[i].getKor() + students[i].getEng() + students[i].getMath();

double avg = Math.round( ((double)sum / 3) * 10 ) / 10;

System.out.println(students[i].getName() + "> 총점:" + sum + " 평균:" + avg);

}

}

 

public int search() {

// 이름입력

System.out.print("이름 = ");

String name = sc.next();

 

// 배열 -> index

int index = -1;

for (int i = 0; i < students.length; i++) {

if(name.equals(students[i].getName())){

index = i;

break;

}

}

 

return index;

}

 

@Override

public void allprint() {

for (StudentDto dto : students) {

if(dto != null && !dto.getName().equals("")) {

System.out.println(dto.toString());

}

}

}

 

}


 

오후 수업  변수의 종류 , Static 

자바에서 메모리를 아끼고 효율적으로 쓰기 위한 '치트키'! 

 


Sample 47
Sample 47- Mainclass

public class MainClass {

 

public static void main(String[] args) {

// TODO Auto-generated method stub

/*

[변수의 종류 - variable ]

local variable ( 지역변수) -> stack 영역에 올라간다 ->블록안에서 연산을 처리하기 위한 변수

parameter variable(매개 변수) -> stack 영역에 올라간다

(class) member variable (멤버 변수 )

 

static variable(정적 변수 )

📦 1. 변수의 종류 (내 변수의 수명은 언제까지일까?)
    • ① 지역 변수 (Local Variable)
      • 개념: 메서드(블록 {}) 안에서 만들어져서, 그 메서드가 끝나는 순간 세상에서 사라지는 시한부 변수예요.
      • 비유: 축제 때 잠깐 설치했다가 축제 끝나면 철거하는 '임시 천막' 같은 존재입니다.
      • 주의점: 블로그에 딱 적어두셨듯이, 지역 변수는 반드시 처음 만들 때 값을 넣어주는 '초기화'를 안 해주면 컴퓨터가 에러를 냅니다! (int number = 0; 처럼요!)
      ② 매개 변수 (Parameter Variable)
      • 개념: 메서드 이름 옆의 소괄호 () 안에 들어있는 변수예요. 밖에서 던져주는 재료를 받아오는 역할을 해요.
      • 비유: 패스트푸드점 드라이브스루에서 주문을 받아 안쪽 주방으로 전달해 주는 '직원' 같은 녀석입니다.
      ③ 멤버 변수 (Member Variable)
      • 개념: 클래스 바로 아래에 만들어서, 객체가 살아있는 동안 쭉 유지되는 변수예요.
      • 비유: 내 가방 속에 계속 들어있는 '지갑' 같은 거예요. 언제든 가방에서 꺼내 쓸 수 있죠. 초기화를 안 해도 자바가 알아서 기본값(0이나 "")으로 채워줍니다!





 

 

*/

int number=0; // 지역변수

System.out.println(number); //int number; 지역변수가 이 상태면 number 밑에 에러 난다 반드시 지역변수 초기화 할것

 

MyClass my = new MyClass();

my.method();

{//블록안에 집어넣는 변수 -> 지역변수에 해당

String name = "홍길동";

}

 

my.func(23);

 

}

 

}

Sample 47- myClass

package Sample47;

 

public class MyClass {

 

private int count; // 멤버변수 -> heap 영역에 올라간다

public void method() {

 

int number; //local variable ( 지역변수)에 해당한다 public void method 밖에서는 실행이 안 된다

System.out.println("count:" + count);

}

//int num = 파라메타 가인수에 해당한다 -> 밖에서 값을 받아오기 위한 변수

public void func(int num) {

num = num +1;

 

}

 

public void name(int count) {

 

this.count = 12;

count =22;

}

}

 

Sample 47 -출력결과 

0

count:0


 

Sample 48
Sample48-MainClass

 

package Sample48;

 

public class MainClass {

public static void main(String[] args) {

/*

static : 정적 -> (메모리저장 영역)움직이지 않는다

 

variable(변수) global(전역)

function(함수)

*/

2. Static (공공의 재산, 공유 치트키)

오늘 오후 수업의 주인공은 바로 이 static이에요! 블로그에 "움직이지 않는다", "정적"이라고 적어두셨죠? 자바에서 static이 붙으면 "객체(new)를 만들지 않아도 메모리에 항상 딱 고정되어 존재한다"는 뜻이에요.
  • 개념: new로 객체를 백만 개 만들어도, static이 붙은 변수나 메서드는 메모리에 딱 한 개만 만들어져서 모든 객체가 공유합니다.
  • 비유: 아파트 단지에 있는 '공용 놀이터' 같은 거예요!
    • 일반 멤버 변수는 각자 집 안에 있는 '개인 장난감'이라 내가 가지고 놀면 내 것만 닳지만,
    • static 변수는 공용 놀이터라 A라는 주민이 와서 낙서를 하면, B라는 주민이 와서 봐도 낙서가 그대로 남아있어요!
그래서 블로그 코드에서 MyClass.st_number++;를 하니까 new로 객체를 새로 만들어도 숫자가 리셋되지 않고 계속 올라갔던 거랍니다!

MyClass mycls = new MyClass();

mycls.method();

mycls.method();

mycls.method();

 

MyClass myclsOne = new MyClass();

myclsOne.method();

myclsOne.method();

 

MyClass.st_number++;

System.out.println(MyClass.st_number);

 

}

}

Sample48-MyClass

package Sample48;

 

public class MyClass {

 

int mem_number; // 멤버변수

static int st_number; // 정적변수

 

public void method() {

int loc_number = 0; // 지역변수

 

loc_number++;

mem_number++;

st_number++;

 

System.out.println("loc_number: " + loc_number);

System.out.println("mem_number: " + mem_number);

System.out.println("st_number: " + st_number);

}

 

}

 


Sample49- 

 

Sample49-MainClass

package Sample49;

 

import java.util.Calendar;

import java.util.GregorianCalendar;

 

public class MainClass {

 

public static void main(String[] args) {

/*

Static

변수 -> global

함수 -> global

*/

 

MyClass.gl_number = 23;

MyClass.static_method();

 

/*

Game game = new Game();

game.init();

game.valueSet();

*/

 

Game game = Game.getInstance();

// Calender cal = new GregorianCalendar();

Calendar cal = Calendar.getInstance();

int year = cal.get(Calendar.YEAR);

 

String strNum = "123";

int number = Integer.parseInt(strNum);

}

 

}

Sample49-GameClass

package Sample49;

 

public class Game {

public Game() {

 

}

public void init() {

 

}

public void valueSet() {

 

}

 

public static Game getInstance() {

Game g = new Game();

g.init();

g.valueSet();

return g;

}

}


Sample50 
Sample50 Main Class

public class Mainclass {

 

public static void main(String[] args) {

// TODO Auto-generated method stub

/*

final : 제약

 

변수, 메소드, 클래스

*/

🔒 3. Final (절대 변경 금지! 자바의 콘크리트)

마지막으로 배운 final은 단어 뜻 그대로 "최종본이니까 절대 건드리지 마!"라는 제약 규칙이에요.

① 변수 앞에 붙을 때 ➡️ 상수가 됨!

  • final int NUMBER = 10; 이라고 선언하는 순간, 이 NUMBER는 평생 10으로 고정돼요. 나중에 NUMBER = 20;으로 바꾸려고 하면 자바가 "절대 안 돼!" 하고 빨간 줄을 뿜어냅니다.
  • 비유: 법으로 정해놓은 '신호등의 빨간불 의미'나 '일주일은 7일' 같은 절대 변하지 않는 규칙을 만들 때 써요. 그래서 보통 다 대문자로 이름을 짓는답니다.

② 클래스나 메서드 앞에 붙을 때 ➡️ 상속/오버라이드 금지!

  • final class Parent ➡️ "이 클래스는 완벽하니까 상속(자식 만들기) 금지!"
  • public final void method() ➡️ "이 메서드는 절대로 자식이 입맛대로 고쳐 쓰지 마! 오버라이딩 금지!"

final int number = 10; // static 로컬 변수는 스타틱이 되지 않아요 ! 멤 버 변수는 가능 ㅋㅋ

 

// number = 11; 이렇게 하면 바로 에러 뜸 =-> final 이 붙는 순간 변수는 상수가 되어버린다 지금부터 넘버는 10이 되는 것

//그럼 어디다 쓰나요? -> 대입하는 용도로 사용한다

int count = number ;

// 위처럼 초기값이나 대입 용도로 많이 사용한다.

 

final int NUMBER = 10; //상수로 지정할 때는 대문자를 사용한다

int count1 = NUMBER; //대부분 final 을 사용할 때 정해진 규칙은 아니지만 대문자를 주로 사용한다

 

final int Max = 10;

final int MIN = 1;

 

int counter = 5;

 

if (counter>= MIN && counter <= Max) {

 

 

}

 

}

 

 

}

 

final class Parent{//final 을 클래스 앞에 붙이면 ? -> 상속 금지 !!!!!!

public final void method() { //over ride 금지 !

 

 

}

}

 

//class Child extends Parent{ // 상속 도지 않음

 

// public void method() { //over ride 안됨

//

// }

//}


 

💡 오후 수업 한 줄 요약!

변수는 **어디서 생기고 언제 죽는지(수명)**가 다르고, static은 다 같이 나눠 쓰는 공용 공간을 만드는 것이며, final은 절대로 값을 바꾸거나 변형할 수 없게 자물쇠를 채우는 것이다!