728x90
★ 클래스 종류
- 클래스
- 인터페이스
- 추상 클래스
- enum
- 제네릭 클래스
- Object
3. 추상 클래스
- 구현 멤버를 가질 수 있다 > 일반 클래스의 성질
- 추상 멤버를 가질 수 있다. > 인터페이스의 성질
- 추상 메소드
- 추상클래스 내에서 작성하는 추상메소드 표기법
- public abstract void typing(String txt);
- 실제 존재하는 멤버를 가질 수 없다.
- 행동의 제약
- 소스코드
abstract class Keyboard{
public int price;
public int weight;
public void test() {
System.out.println("test");
}
//void typing(String txt); //인터페이스내에서만 작성하는 추상메소드 표기법
//추상메소드
public abstract void typing(String txt);
//추상 클래스 내에서만 작성하는 추상메소드 표기법
//둘다 하는일은 똑같음
}
/*
interface Keyboard{
//실제 존재하는 멤버를 가질수 없다.
//public int price;
//public int weight;
//행동의 제약
void typing(String txt);
}
*/
//키보드
class K810 extends Keyboard{ // 인터페이스 상속 > 인터페이스 구현
public String color;
public int price;
public int weight;
public void typing(String txt) {
}
}
//class K380 extends Keyboard{
//
// public int price;
// public int weight;
// public int size;
//
// public void keydown(String txt) {
//
// }
//
//}
- 상속
- 1. 클래스
- 2. 인터페이스
- 3. 추상클래스
부모 <- 자식
클래스 클래스 : O
인터페이스 클래스 : O (상속된 추상 클래스를 자식이 구현해야한다)
추상클래스 클래스 : O (구현멤버는 그대로 상속받고 추상멤버는 구현한다.)
인터페이스 인터페이스: O
추상클래스 추상클래스 : O
인터페이스 추상클래스
추상클래스 인터페이스
클래스 인터페이스
클래스 추상클래스
- 소스코드
interface AAA{
void aaa(); // 추상
}
abstract class BBB{
public int b; // 구현
public abstract void bbb(); // 추상
}
abstract class FFF extends BBB{
public int f; //본인 멤버
public void bbb() {
}
}
class CCC{
public int c;
}
interface DDD extends AAA{
void ddd();
}
class EEE implements DDD{
public void ddd() {
}
public void aaa() {
}
}
4. enum
- 열거형(Enumeration)
- 여러개 값을 가지고 있는 자료형 > 객관식(선택형)
- 예제 1) 주관식
String color = "빨강";
if(color.equals("빨강") || color.equals("노랑") || color.equals("파랑")) {
System.out.println("판매 가능");
}else {
System.out.println("재고 없음");
}
- 예제 2) 객관식
//Case 2. 객관식
int input = Color.RED;
//Color.RED = 5; 고유한 번호 Final을 변경하려고 했기 때문에 오류 발생
if(input==0 || input==1 || input == 2) {
System.out.println("판매 가능");
}else {
System.out.println("재고 없음");
}
class Color {
public final static int RED = 0;
public final static int YELLOW = 1;
public final static int BLUE = 2;
}
- enum 사용
//Case 3. enum
Colour input2 = Colour.RED;
if(input2==Colour.RED || input2 == Colour.YELLOW || input2 == Colour.BLUE) {
System.out.println("판매 가능");
}else {
System.out.println("재고 없음");
}
String gender = "남자";
String gender2 = "f";
Gender gender3 = Gender.MALE;
enum Colour {
RED, //final static 상수(정수)
YELLOW,
BLUE
}
4. Generic
- T : 타입 변수 : 자료형을 저장하는 변수 > 값형식은 불가능, 참조형식만 가능
- <> : 인자리스트
- ex) class Item <T> {}
- 소스코드
public static void main(String[] args) {
//Item is a raw type. References to generic type Item<T> should be parameterized
//Item item1 = new Item();
Item<String> item2 = new Item<String>();
item2.c = "홍길동";
Item<Integer> item3 = new Item<Integer>();
item3.c = 200;
//Item<int> item4 = new Item<int>();
//Item<double> item5;
//Item<Double> item6;
Pen<Boolean> p = new Pen<Boolean>();
p.a = true;
p.b = false;
p.c = true;
Desk<Double> d = new Desk<Double>();
d.set(3.14);
System.out.println(d.get() * 2);
Cup<Integer, String> cup = new Cup<Integer, String>(100, "문자열");
System.out.println(cup.getA());
System.out.println(cup.getB());
}//main
}//main class
//제네릭 클래스
//1. T : 타입 변수 > 자료형을 저장하는 변수 > 값형식은 불가능, 참조형식만 가능
//2. <> : 인자 리스트
class Item <T> {
public int a;
public int b;
public T c; //클래스 설계 당시에는 c의 자료형이 결정되지 않음 > (나중에) > 객체 생성할 때 결정
}
class Pen<T> {
public T a;
public T b;
public T c;
}
class Desk<T> {
public T a; //멤버 변수의 자료형
public void set(T a) { //매개변수 자료형
this.a = a;
T b; //지역변수 자료형 > 비권장(외부에 노출이 안되서.. 컨트롤이 힘들어진다.)
}
public T get() { //반환값 자료형
return this.a;
}
}
class Cup<T, U> {
public T a;
public U b;
public Cup(T a, U b) {
this.a = a;
this.b = b;
}
public T getA() {
return this.a;
}
public U getB() {
return this.b;
}
}
6. Object
- 모든 클래스의 부모 클래스로, 루트 클래스라고 할 수 있다.
- object를 이용한 다양한 타입의 변수 사용방법
- 소스코드
public static void main(String[] args) {
int n = 10;
String s = "홍길동";
AAAA a1 = new AAAA();
AAAA a2 = new BBBB(); //업캐스팅
AAAA a3 = new CCCC(); //업캐스팅
//*** Object 변수는 모든 것을 담을 수 있는 만능 주머니이다.
//*** 값형 대상 > 박싱, 언박싱 발생
//*** Object 변수안의 값이 어떤 타입인지를 확인하기 힘들다;; > 다운 캐스팅 오류 !!!
Object o1 = new Object();
Object o2 = new AAAA(); //업캐스팅
Object o3 = new BBBB();
Object o4 = new CCCC();
Object o5 = new Date();
Object o6 = new Scanner(System.in);
Object o7 = Calendar.getInstance();
Object o8 = new BufferedReader(new InputStreamReader(System.in));
//Object = int
//참조형 = 값형
//Object 변수에 값형의 값을 입출력 > 박싱/언박싱이 발생한다. > 비효율
Object o9 = 10; //박싱(Boxing) > 10 자료형? > new Integer(10)
System.out.println(o9.toString());
//System.out.println(o9 * 2);
System.out.println((Integer)o9 * 2); //정석, 언박싱(Unboxing)
System.out.println((int)o9 * 2); //서비스 문법
//**** 값형 변수안에는 데이터만 저장 가능
//**** 참조형 변수안에는 주소값만 저장 가능
int n1 = 10; //값형
Integer n2 = new Integer(20); //참조형
System.out.println(n2 * 2);
//원래 타입으로 형변환
Scanner scan = (Scanner)o3;
}//main
}//main class
class AAAA {
public String name;
}
class BBBB extends AAAA {
public int age;
}
class CCCC extends BBBB {
public String address;
}
★ 클래스 설계 : 다양한 방법을 이용한 멤버 변수 선언 방법
- 요구사항 : 멤버 변수를 중심으로 여러가지 행동을 하는 메소드 선언
- 멤버 변수 선언 > int
- 추가사항] boolean을 중심으로 하는 클래스 추가 설계
- 추가사항] String을 중심으로 하는 클래스 추가 설계
- 방법 1. 일일이 다 생성해주는 방법
- 소스코드
WrapperInt n1 = new WrapperInt(10);
System.out.println(n1.getData());
System.out.println(n1.getData()*2);
System.out.println(n1.toString());
System.out.println();
WrapperString s1 = new WrapperString("홍길동");
System.out.println(s1.getData());
System.out.println(s1.getData().length());
System.out.println(s1.toString());
System.out.println();
WrapperBoolean b1 = new WrapperBoolean(true);
System.out.println(b1.getData());
System.out.println(b1.getData() ? "참" : "거짓");
System.out.println(b1.toString());
System.out.println();
class WrapperInt {
private int data; //클래스 중심이 되는 데이터
public WrapperInt(int data) {
this.data = data;
}
public int getData() {
return data;
}
public void setData(int data) {
this.data = data;
}
@Override
public String toString() {
return "data = " + this.data;
}
}
class WrapperString {
private String data; //클래스 중심이 되는 데이터
public WrapperString(String data) {
this.data = data;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
@Override
public String toString() {
return "data = " + this.data;
}
}
class WrapperBoolean {
private boolean data; //클래스 중심이 되는 데이터
public WrapperBoolean(boolean data) {
this.data = data;
}
public boolean getData() {
return data;
}
public void setData(boolean data) {
this.data = data;
}
@Override
public String toString() {
return "data = " + this.data;
}
}
- 방법 2. Object 클래스 사용
- 소스코드
WrapperObject n2 = new WrapperObject(20);
System.out.println(n2.getData());
System.out.println((Integer)n2.getData()*2);
System.out.println(n2.toString());
System.out.println();
WrapperString s2 = new WrapperString("아무개");
System.out.println(s2.getData());
System.out.println(((String)s2.getData()).length());
System.out.println(s2.toString());
System.out.println();
WrapperObject b2 = new WrapperObject(false);
System.out.println(b2.getData());
System.out.println((Boolean)b2.getData() ? "참" : "거짓");
System.out.println(b2.toString());
System.out.println();
class WrapperObject {
private Object data;
public WrapperObject(Object data) {
this.data = data;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public String toString() {
return "data = " + data;
}
}
- 방법 3. Generic 사용
- 소스코드
Wrapper <Integer> n3 = new Wrapper <Integer> (30);
System.out.println(n3.getData());
System.out.println(n3.getData()*2);
System.out.println(n3.toString());
System.out.println();
Wrapper <String> s3 = new Wrapper <String> ("이클립스");
System.out.println(s3.getData());
System.out.println(s3.getData().length());
System.out.println(s3.toString());
System.out.println();
Wrapper <Boolean> b3 = new Wrapper<Boolean> (true);
System.out.println(b3.getData());
System.out.println(b3.getData() ? "참" : "거짓");
System.out.println(b3.toString());
System.out.println();
class Wrapper<T> {
private T data;
public Wrapper(T data) {
this.setData(data);
} //생성자는 딱 한번만 호출
public T getData() {
return data;
}// 값을 다시 전달해주는 역할
public void setData(T data) {
this.data = data;
}// 사용자에게 값을 받아다가 여기 변수에다가 넣어주는 역할
@Override
public String toString() {
return "data = " + data;
}
}
728x90
'자바' 카테고리의 다른 글
JAVA STEP 33. ArrayList 직접 구현하기 (0) | 2023.02.23 |
---|---|
JAVA STEP 32. 컬렉션(ArrayList) (0) | 2023.02.23 |
JAVA STEP 30. Interface (0) | 2023.02.21 |
JAVA STEP 29. CASTING (0) | 2023.02.21 |
JAVA STEP 28. 상속, Static 예제 (0) | 2023.02.20 |