수업 소개
클래스
= 서로 연관된 메소드와 변수를 모아서 이름 붙인 것
객체지향 프로그래밍 Object-Oriented Programming
= 클래스를 중심으로 프로그램 구조를 만드는 프로그래밍 방법론
객체지향 언어
= 이런 방법론을 언어 차원에서 제공하는 언어
메소드를 다른 컴퓨터 언어에서는 함수 function, subroutine, procedural이라고 한다.
절차 지향 프로그래밍 Procedural Programming
= 메소드를 이용해 프로그램을 정리 정돈하는 방법
인터페이스
= 클래스의 설계도
남의 클래스 & 남의 인스턴스
나의 클래스, 나의 인스턴스를 만들기 전에 남의 클래스, 남의 인스턴스를 사용하는 법을 먼저 알아보자.
FileWriter 어떤 정보를 파일로 기록할 때 사용하는 클래스
import java.io.FileWriter;
import java.io.IOException;
public class OthersOOP {
public static void main(String[] args) throws IOException {
// class : System, Math, FileWriter
// instance : f1, f2
System.out.println(Math.PI);
System.out.println(Math.floor(1.8)); // 소수점을 0으로
System.out.println(Math.ceil(1.8)); // 올림
FileWriter f1 = new FileWriter("data.txt");
f1.write("Hello");
f1.write(" Java");
f1.close();
FileWriter f2 = new FileWriter("data2.txt");
f2.write("Hello");
f2.write(" Java");
f2.close();
}
}
변수와 메소드
메소드가 없을 때 불편한 점을 알아보자.
public class MyOOP {
public static void main(String[] args) {
delimeter = "----";
printA();
printA();
printB();
printB();
delimeter = "****";
printA();
printA();
printB();
printB();
}
public static String delimeter = "";
public static void printA() {
System.out.println(delimeter);
System.out.println("A");
System.out.println("A");
}
public static void printB() {
System.out.println(delimeter);
System.out.println("B");
System.out.println("B");
}
}
// 결과 값
----
A
A
----
A
A
----
B
B
----
B
B
****
A
A
****
A
A
****
B
B
****
B
B
반복되는 연관 코드를 메소드로 만들고 지역 변수를 전역 변수로 만들어 프로그램을 간결하고 가독성을 좋게 만든다.
전역 변수로 선언하면 일일히 메소드 안에 인자 값을 주지 않아도 된다.
클래스 - 존재 이유와 기본 형식
class Print {
public static String delimeter = "";
public static void A() {
System.out.println(delimeter);
System.out.println("A");
System.out.println("A");
}
public static void B() {
System.out.println(delimeter);
System.out.println("B");
System.out.println("B");
}
}
public class MyOOP {
public static void main(String[] args) {
Print.delimeter = "----";
Print.A();
Print.A();
Print.B();
Print.B();
Print.delimeter = "****";
Print.A();
Print.A();
Print.B();
Print.B();
}
}
클래스는 서로 연관된 메소드들을 묶어놓기 때문에 가독성이 좋다.
클래스 - 형식
메인 클래스와 함께 내장된 클래스를 외부에 독립시켜 다른 앱에서도 사용할 수 있게 한다.
// MyOOP.java
public class MyOOP {
public static void main(String[] args) {
Print.delimeter = "----";
Print.A();
Print.A();
Print.B();
Print.B();
Print.delimeter = "****";
Print.A();
Print.A();
Print.B();
Print.B();
}
}
// Print.java
class Print {
public static String delimeter = "";
public static void A() {
System.out.println(delimeter);
System.out.println("A");
System.out.println("A");
}
public static void B() {
System.out.println(delimeter);
System.out.println("B");
System.out.println("B");
}
}
인스턴스
여러 상태의 클래스가 동시에 필요할 때는 클래스 앞에 new를 붙여서 클래스의 복제본을 만들어 다른 상태를 유지할 수 있다.
클래스의 복제본을 인스턴스라 한다. 객체지향의 핵심이라고 할 수 있다.
클래스와 인스턴스는 내부적으로 같다.
인스턴스는 클래스의 복제본으로 이름을 붙여 사용한다.
이름이 다른 인스턴스들은 각각 다른 값을 저장할 수 있다.
클래스를 인스턴스화 하고 싶다면 변수와 메서드에 static이 없어야 한다.
// MyOOP.java
public class MyOOP {
public static void main(String[] args) {
Print p1 = new Print();
p1.delimiter = "----";
p1.A();
p1.A();
p1.B();
p1.B();
Print p2 = new Print();
p2.delimiter = "****";
p2.A();
p2.A();
p2.B();
p2.B();
p1.A();
p2.A();
p1.A();
p2.A();
}
// Print.java
class Print {
public String delimiter = "";
public void A() {
System.out.println(delimiter);
System.out.println("A");
System.out.println("A");
}
public void B() {
System.out.println(delimiter);
System.out.println("B");
System.out.println("B");
}
}
// 결과 값
----
A
A
----
A
A
----
B
B
----
B
B
****
A
A
****
A
A
****
B
B
****
B
B
----
A
A
****
A
A
----
A
A
****
A
A
static
static 있으면 클래스 소속
static 없으면 인스턴스 소속
클래스를 통해 클래스 변수에 접근 가능하다.
인스턴스 변수는 인스턴스만 통해서 사용하도록 만들어졌다.
class Foo {
public static String classVar = "I class var";
public String instanceVar = "I instance var";
public static void classMethod() {
System.out.println(classVar); // OK
// System.out.println(instanceVar); // Error
}
public void instanceMethod() {
System.out.println(classVar); // OK?
System.out.println(instanceVar); // OK
}
}
public class StaticApp {
public static void main(String[] args) {
System.out.println(Foo.classVar); // OK
// System.out.println(Foo.InstanceVar); // Error
Foo.classMethod();
// Foo.instanceMethod();
Foo f1 = new Foo();
Foo f2 = new Foo();
System.out.println(f1.classVar); // I class var
System.out.println(f1.instanceVar); // I instance var
f1.classVar = "changed by f1";
System.out.println(Foo.classVar); // changed by f1
System.out.println(f2.classVar); // changed by f1
f1.instanceVar = "changed by f1";
System.out.println(f1.instanceVar); // changed by f1
System.out.println(f2.instanceVar); // I instance var
}
}
아직은 이해가 다 안 가지만 많은 예제로 익숙해져야겠다
생성자와 this
인스턴스를 생성할 때 해야 할 초기화 작업을 정의하는 생성자에 대해 살펴보자.
생성자 Constructor
클래스명과 동일하게 작성되며 인사말 같은 존재다.
초기에 주입할 필요가 있는 값을 전달하거나 초기에 작업을 수행하도록 한다.
this
클래스 안의 인스턴스를 가리킨다.
class 클래스 {
public String 변수;
public 클래스 (String 변수) { // 인스턴스 생성시 static이나 void 수식어 안 붙임
this.변수 = 변수;
}
}
이해가 안돼.. 몇 번 다시 봐야겠다.
클래스와 인스턴스를 프로젝트에 도입함으로서 코드는 정리해보자
클래스 활용
class Accounting {
public static double valueOfSupply;
public static double vatRate = 0.1;
public static double getVAT() {
return valueOfSupply * vatRate;
}
public static double getTotal() {
return valueOfSupply + getVAT();
}
}
public class AccountingApp {
public static void main(String[] args) {
Accounting.valueOfSupply = 10000.0;
System.out.println("Value of supply : " + Accounting.valueOfSupply);
System.out.println("VAT : " + Accounting.getVAT());
System.out.println("Total : " + Accounting.getTotal());
}
}
|
인스턴스 활용
// 인스턴스 적용 전
class Accounting {
public static double valueOfSupply;
public static double vatRate = 0.1;
public static double getVAT() {
return valueOfSupply * vatRate;
}
public static double getTotal() {
return valueOfSupply + getVAT();
}
}
public class AccountingApp {
public static void main(String[] args) {
Accounting.valueOfSupply = 10000.0;
System.out.println("Value of supply : " + Accounting.valueOfSupply);
System.out.println("VAT : " + Accounting.getVAT());
System.out.println("Total : " + Accounting.getTotal());
}
}
// 인스턴스 적용 후
class Accounting {
public double valueOfSupply;
public static double vatRate = 0.1;
public double getVAT() {
return valueOfSupply * vatRate;
}
public double getTotal() {
return valueOfSupply + getVAT();
}
}
public class AccountingApp {
public static void main(String[] args) {
Accounting a1 = new Accounting();
a1.valueOfSupply = 10000.0;
Accounting a2 = new Accounting();
a2.valueOfSupply = 20000.0;
System.out.println("Value of supply : " + a1.valueOfSupply);
System.out.println("Value of supply : " + a2.valueOfSupply);
System.out.println("VAT : " + a1.getVAT());
System.out.println("VAT : " + a2.getVAT());
System.out.println("Total : " + a1.getTotal());
System.out.println("Total : " + a2.getTotal());
}
}
// 생성자화 시키기
class Accounting {
public double valueOfSupply;
public static double vatRate = 0.1;
public Accounting(double valueOfSupply) {
this.valueOfSupply = valueOfSupply;
}
public double getVAT() {
return valueOfSupply * vatRate;
}
public double getTotal() {
return valueOfSupply + getVAT();
}
}
public class AccountingApp {
public static void main(String[] args) {
Accounting a1 = new Accounting(10000.0);
a1.valueOfSupply = 10000.0;
Accounting a2 = new Accounting(20000.0);
a2.valueOfSupply = 20000.0;
System.out.println("Value of supply : " + a1.valueOfSupply);
System.out.println("Value of supply : " + a2.valueOfSupply);
System.out.println("VAT : " + a1.getVAT());
System.out.println("VAT : " + a2.getVAT());
System.out.println("Total : " + a1.getTotal());
System.out.println("Total : " + a2.getTotal());
}
}
'Java > 생활코딩' 카테고리의 다른 글
생활코딩 JAVA 상속 (0) | 2022.03.17 |
---|---|
메소드 Method (0) | 2022.03.16 |
생활코딩 JAVA 제어문 (0) | 2022.03.15 |
인스턴스 Instance (0) | 2022.03.15 |
생활코딩 JAVA1 (0) | 2022.03.06 |