1. 추상(Abstract) 클래스
빼낸다 -> 불안전한 메서드 생성 -> 인스턴스를 생성할수 없다
상속을 통하여 완전한 메서드로 사용(상속된 메서드는 구현체 일명 Implement 또는 Service)
1개라도 추상클래스가 있으면 추상클래스
참고) 메서드 4요소 : 메서드 이름, 파라메터 갯수타입, return value, body
1.1 추상클래스의 개념
- 추상클래스를 상속받은 클래스는 추상클래스가 가지고 있는 모든 추상클래스들 오버라이딩 해야한다.
1.2 추상클래스 문법
super가 소유한 추상메서드
안보이는거 보이기(생략문구 찾기)
abstract void bb() --> public void bb의 추상(즉 public static 생략됨)
1.3 추상클래스의 사용이유
일을 동시 진행 협업을 하기 위해 -> 없어도 구현할수 있다 생성만 빼고
package day2.abstractexam;
abstract class Afunction{
public abstract void searchInform(String name, int phoneNum) ;
public abstract void runService(int memberId, int request) ;
}
class AfunctionImpl extends Afunction{
@Override
public void searchInform(String name, int phoneNum) {
System.out.println(name + " 고객님의 정보를 찾았습니다");
}
@Override
public void runService(int memberId, int request) {
System.out.println(memberId + " 고객님의 요청하신 서비스를 수행합니다");
}
}
public class AbstractExam {
public static void main(String[] args) {
Afunction aref = new AfunctionImpl() ; //Afunction로 임시 넣고 가능 동시진행이유
aref.searchInform("장그래", 0101112222) ;
aref.runService(100, 1) ;
}
}
2. 인터페이스(Interface)
2.1 인터페이스의 개념
- 100% 불완전한 메서드로 이루어진 것
- 열거형(클래스가 아닌것이 클래스.변수로 사용 즉 public static final이 생략됨)
용어상) 두개의 물체가 만나는 접속면
java는 다중상속을 지원하지 않음 -> 단일상속이다
2.2 인터페이스 문법
- 공식적인 클래스가 아님(Interface로 선언)
- extends로 선언 불가 -> implements 키워드 사용
- 메서드 오러라이딩의 원칙 -> 즉 public 만 접근제어 가능(public static final 생략됨)
참고) 메서드 overriding의 접근제어 고찰
접근제어는 같거나 넓어질수만 있다(Interface는 항상 접근제어는 public이다)
2.3 인터페이스의 사용이유
다중상속(x) -> 느슨한 결함(Loose Coupling)관계를 만들기 위해
Oracle, DB2 등등 회사가 바뀌어도 기능은 동일하게 즉 메서드가 변하지 않는다(코드변화가 없다)
2.4 인터페이스의 기타 사용
2.4.1 C언어의 열거형(enum type)처럼 사용되는경우
interface Week
{
int SUN=0, MON=1, TUE=2, WED=3, THU=4, FRI=5, SAT=6 ;
}
열거형(클래스가 아닌것이 클래스.변수로 사용 즉 public static final이 생략됨)
2.4.2 마크 인터페이스(Mark Inteface 또는 Tag Interface)
아무런 형태없이 텅 빈상태(분류를 위해 사용)
Data1 Data2 하나는 상속 아니면 없음
~able로 선언된것들이 대부분 Serializable과 Parcelable, Cloneable, Runnable 등등
2. 내부클래스(Inner Class)
1. 내부클래스 (Inner Class or Instance Class)
내부클래스는 외부클래스에 대해 변수접근 가능 -> 캡슐화 강도가 최대가 되는 장점이 있다(a 와 b 클래스를 나눌수 없다)
- 내부클래스에서는 외부클래스의 변수와 메서드를 자유롭게 사용할수 있다
- 내부 클래스 이름앞에 접근제어는 4종류 모두 사용가능하다
- 내부 클래스는 외부클래스가 소유하고 있는 변수 , 메서드와 동일하게 취급된다.
1.1 내부클래스(Inner Class or Instance Class)
반드시 외부클래스 생성후 내부클래스 생성해야된다.
OuterClass out = new OuterClass();
OuterClass.Inner in = out.new Inner();
1.2 정적 내부 클래스(Static Class)
내부클래스가 static사용하여
- 외부클래스를 인스턴스 생성하지 않아도 내부클래스를 사용가능(static은 메모리 생성)
- 정적 내부 클래스에서는 외부 클래스의 static 변수와 메서드만 접근 가능
1.3 지역 클래스(Local Class)
외부클래스의 메서드 내부에서 선언되는 클래스
- 외부클래스가 가지고 있는 모든 인스턴스 변수, static변수, 메서드 접근 가능
- 지역클래스가 선언된 메서드가 가지고 있는 지역변수 접근가능(단 final로 선언된 변수만 접근가능)
- 지역변수와 같은 특성으로 메서드 내부에서만 인스턴스 생성가능
- 지역 클래스는 지역변수처럼 접근제어가 default인 변수만 선언 가능
- 메서드 종료시 메모리 삭제됨 (중괄호가 닫히기전에 생성과 사용이 끝나야됨 return type은 꼭 상위interface로)
package day2.localclass;
class LocalClassExample{
private int num1 = 0;
private static int num2 = 10;
private static final int num3 = 100;
public void outerMethod1() {
String city1 = "서울";
final String city2 = "뉴욕";
System.out.println(city1);
System.out.println(city2);
System.out.println("파리");
}
public void outerMethod2() {
//public int aa= 0; 컴파일 에러
String hello = "안녕하세요";
//private final int bb = 1; 컴파일 에러
//private static int cc = 2; 컴파일 에러
final int finalNumber = 2015;
class Local {
public void localMethod() {
System.out.println("외부클래스 메서드 접근가능");
outerMethod1();
System.out.println("외부클래스 변수 접근가능");
System.out.println(num1);
System.out.println(num2);
System.out.println(num3);
}
public void localMemberDisplay() {
System.out.println(
"LocalClass를 포함하는 메서드의 변수 : ");
//System.out.println(hello); 컴파일 에러
System.out.println(finalNumber);
}
}
Local local = new Local();
local.localMethod();
local.localMemberDisplay();
}
}
public class LocalClass {
public static void main(String[] args) {
LocalClassExample test = new LocalClassExample();
test.outerMethod2();
}
}
1.4 무명 클래스(Anonymous Class)
지역클래스하고 유사 다만 클래스 선언이 아에 없는 특이한 구조로 클래스 이름이 없다, 다만 인스턴스생성과 구현만 있음
- 인터페이스를 구현한 클래스의 사용빈도가 극히 적을 경우
- 한번만 사용되는 인스턴스인 경우
==> 태생이 지역클래스의 일부 생략
그리고 마지막에 ";"으로 끝난다, interface앞에 new가 있다
package day2.anonymous;
interface Anony
{
public void readName();
}
class OuterClass
{
private String className;
OuterClass(String className)
{
this.className=className;
}
public Anony outerMethod(final String id)
{
return new Anony()
{
public void readName()
{
System.out.println("Outer ClassName: "+className);
System.out.println("Local ID: "+id);
}
};
}
}
class Anonymous
{
public static void main(String[] args)
{
OuterClass out=new OuterClass("My Outer Class");
Anony ano1=out.outerMethod("My First Anonymous Class");
ano1. readName();
Anony ano2=out.outerMethod("My Second Anonymous Class");
ano2.readName();
}
}
return new Anony() { body };- > class AnonyLocal implements Anony 와 같다
※ Anony 는 interface이다
3. 기타문법
1. Enum Type
java5에서 시작
열거형의 태생은 가독성을 위해 switch하고 같이 사용하려구
1.1 Enum 개념
Interface에서 사용 예

enum형(메서드 파라메터 타입에 열거형 즉 validation하기 위해 - 잘못됬을때 멈춤)

사용시 클래스 없이 접근 가능
1.2 Enum 메서드와 enum상수에 데이터 입력
생성자와 동일하게 사용되는데 static 부분과 static 이 아닌부분으로 나누어짐
열거형 상수가 진화하여 문자열도 사용가능(단 getter, setter를 생성)
= > Class가 아닌대 대문자,
※ setter는 생성자로, public static final 숨겨있음
package day2.enumparents3;
enum Parents {
FATHER("아버지"), MOTHER("어머니");
private String call;
Parents(String call){
this.call = call;
}
String getCall(){
return call;
}
}
public class EnumParents3 {
public static void printParents (Parents p){
System.out.println(p);
}
public static void print(Parents d){
switch (d) {
case FATHER:
System.out.println("아빠");
break;
case MOTHER:
System.out.println("엄마");
break;
default:
System.out.println("부모님 중 한 분만 !!");
}
}
public static void main(String[] args) {
printParents(Parents. MOTHER);
print(Parents.FATHER);
print(Parents.MOTHER);
// print(Parents.BROTHER); 컴파일 에러
for(Parents p : Parents.values()){
System.out.println("enum 내부 데이터 : " + p);
}
System.out.println(Parents.FATHER.getCall());
}
}

value관련 메서드는 static, 다른건 non-static변수임 레퍼변수.상수.name....
1.3 Enum 실제 클래스 사용
역컴파일로 풀면 Enum을 상속받은 class로 만들어짐
참고) for each (=enhanced - for)
두덩어리 1) 저장소에 들어간 타입
2) java저장소 2가지 배열, 클래스만 있고 무조건 처음부터 끝까지
for(저장소 타입 : 저장소)
2. Variable Argument
java5에서 시작
method overloding을 피하기 위해 생겨남
2.1 Vaiable Arguments 개념
클래스 overloding의 확장 개념이라고 생각됨
- 메서드 호출시 파라미터의 개수를 마음대로 선언할수 있다
- 파라미터 선언시 항상 마지막에 위치(혼합사용)
- 자동으로 1차원 배열처리 해준다
ex) public static void vArg(String name, int .. gnums){
for(int s : gnums.values()){
}
for(저장소 타입 : 저장소)
'IT > java' 카테고리의 다른 글
Java 교육 Step4(스레드 스트림과 FileI/O) (0) | 2022.07.14 |
---|---|
Java 교육 Step3(래퍼 클래스, 제너릭, 컬렉션 프레임워크) (0) | 2022.07.14 |
Java 교육 Step1 (OOP,String, Console In/Out, 상속) (0) | 2022.07.14 |
[Eclipse] Jar 배포 (0) | 2020.12.25 |
[Java 기초] 정의 (0) | 2020.12.20 |