웹_프론트_백엔드/단과

[단과_JAVA] 2020.02.19

shine94 2020. 2. 19. 22:30

1. Data영역
1) 전역변수

 : new로 필드에 올라가고 new로 초기화 된다.
   객체별로 하나씩 존재한다. 공유하지 않는다.

 
2) static변수

 : 컴파일러가 올려주고 new로 초기화되지 않는다.
   단 한 개만 존재하기 때문에 모든 객체가 공유한다.

 


2. 접근권한 제어자
1) default

 : 다른 패키지에서 접근 불가(자식도 불가능)


2) public

 : 모든 패키지에서 접근 가능


3) protected

 : 다른 패키지에서 접근 불가(자식은 가능)


4) private

 : 다른 클래스에서 접근 불가

 


3. 추상 클래스
 : 클래스 내에 메소드를 선언할 때,
   {}(바디)없이 선언한다면 추상적인 개념이라 할 수 있고, 

   자식 클래스에는 반드시 재정의 해주어야 한다. 

   따라서 이런 메소드를 추상메소드라고 하며, 

   추상 메소드가 있는 클래스를 추상 클래스라고 한다

 

** [요약] 바디가 없는 메소드를 추상 메소드라고 하고 
            추상 메소드가 있는 클래스를 추상 클래스라고 함

** 추상 메소드가 있는 이유?
                                    반드시 재정의가 필요할 때

** 추상 클래스에는 3가지 종류의 메소드가 있음
    ① 재정의가 반드시 필요한 추상 메소드
    ② 사용해도 되고 사용 안해도 되는 일반 메소드
    ③ 재정의가 절대 불가능한 메소드(final로 지정된 메소드)

 


4. 추상 클래스 선언
    abstract class 클래스명{
          abstract 리턴타입 메소드명(매개변수, ...);
    }

 

 

5. 추상 클래스는 클래스이기 때문에 일반 메소드도 선언할 수 있다. 

    자식에서 반드시 구현해야할 메소드는 추상 메소드로 선언하고 

    아닌 경우 일반 메소드로 선언한다.

 


6. 추상 클래스 객체화
 : 생성자 뒤에서 중괄호가 열리고
   그 안에서 추상 메소드를 모두 재정의 해주어야 한다.

 

 
7. 인터페이스(Interface)
 : 추상클래스를 고도화 시킨 문법이다.
   상수와 추상 메소드만 존재하며 키워드는 생략 가능하다(final static, abstract)
   다른 클래스에 지정할 때에는 extends가 아니라 implements를 사용한다. 

   지정받은 클래스에는 반드시 추상메소드 모두를 재정의 후 사용해야 한다. 

   인터페이스는 콤마로 여러 개를 사용할 수 있다. 


** 인터페이스에는 2가지 종류의 메소드가 있음
    ① 재정의가 반드시 필요한 추상 메소드
    ② 재정의가 절대 불가한 상수

 

 

8. 인터페이스에서는 일반 메소드 사용 불가

 

 

9. 인터페이스 선언

    public class A implements b, c, d, ... {}


10. 인터페이스 생성(Ctrl + N)

 

 

11. 인터페이스 구현

① 클래스 만들때 설정

② 클래스 만든 뒤 직접 키워드 입력하여 작성 -> Add로 추가하기

 

 

12. JAVA는 다중 상속은 지원하지 않으나 다중 지정은 가능하다. 

 

 

13. 메소드 
 : 이름(), 저장공간

 

 

14. 오늘 실습코드

1) instanceof 예제

** TV 메인메소드 **

package day26;

public class TV {
	
	void checkAni(Animation ani) {
		if(ani instanceof RunHaney) {
			System.out.println("달려라 하니입니다.");
			RunHaney r = (RunHaney) ani;
			
		}else{
			System.out.println("달려라 하니가 아닙니다.");
		}
	}
	
	public static void main(String[] args) {
		TV tv = new TV();

		YeongSim y = new YeongSim();
		RunHaney r = new RunHaney();
		Titanic t = new Titanic();
		
		tv.checkAni(y);
		tv.checkAni(r);
		
	}
}

 

** Animation 클래스 **

package day26;

public class Animation {
	
}

 

** Animation 클래스를 상속받은 Frozen, RunHaney, YeongSim 클래스 **

package day26;

public class Frozen extends Animation{

}
package day26;

public class RunHaney extends Animation{

}
package day26;

public class YeongSim extends Animation{
	
}

 

** Animation 클래스를 상속받지 않은 Titanic 클래스 **

package day26;

public class Titanic {
	
}

 

2) 추상클래스 예제

** abs 패키지, Board 메인메소드 **

package abs;

public class Board {
	public static void main(String[] args) {
		Rect r = new Rect();
		r.printArea(30.4, 32.6);
		r.intro();
		r.function();
		
//		Shape s = new Shape() {
//			
//			@Override
//			void printArea(double w, double h) {
//				System.out.println("추상 클래스 객체화");
//			}
//		};
//		s.printArea(0, 0);
	}
}

 

** abs 패키지, Shape 클래스 **

package abs;

//추상클래스
//실수를 막아줄 수 있고
//강조의 역할을 한다
public abstract class Shape {
	double area;
	
	//추상메소드 : 반드시 재정의 필요
	abstract void printArea(double w, double h);
	
	//일반메소드 : 재정의해도 되고, 안해도 되고
	void intro() {
		System.out.println("도형입니다.");
	}
	
	//final로 지정된 메소드 : 절대로 재정의가 불가능
	final void function() {
		System.out.println("부모 메소드");
	}
	
}

class Rect extends Shape{

	@Override
	void printArea(double w, double h) {
		area = w * h;
		System.out.println("넓이 : " + area + "cm²");
	}
	
}

class Tri extends Shape{

	@Override
	void printArea(double w, double h) {
		area = (w * h) / 2;
		System.out.println("넓이 : " + area + "cm²");
	}
}

 

3) 전역변수, static변수 예제

** variable 패키지, Test 메인메소드 **

package variable;

public class Test {
	public static void main(String[] args) {
		Variable v1 = new Variable();
		Variable v2 = new Variable();
		
        
		//정적변수(static)
		//컴파일러로 메모리에 올라감
		//즉, new를 만나도 초기화 안됨
		v1.init_s();
		v1 = new Variable();
		v1.init_s();
		v1.init_s();
		v1.init_s();
		v1.init_s();
		v1.init_s();
		v1.init_s();
		
		/*
		//전역변수
		//new를 만나면 초기화됨
		v1.init();
		v1.init();
		v1.init();
		v1 = new Variable();
		v1.init();
		v1.init();
		v1.init();
		v1.init();
		v1.init();
		v1.init();
		*/
		
		
	}
}
package access;

public class Data {
	int data1;
	public int data2;
	protected int data3;
	private int data4;
	
}

 

** variable 패키지, Variable 클래스 **

package variable;

public class Variable {
	int data;
	static int data_s;
	
	void init() {
		System.out.println(++data);
	}

	void init_s() {
		System.out.println(++data_s);
	}
}

 

4) 접근권한 제어자 예제

** access 패키지, ClassMain 클래스와 Data 클래스 **

package access;

public class ClassMain {
	public static void main(String[] args) {
		Data d = new Data();
		//private은 접근 불가
	}
}
package access;

public class Data {
	int data1;
	public int data2;
	protected int data3;
	private int data4;
	
}

 

** access2 패키지, ClassMain 클래스 **

package access2;

import access.Data;

//하나의 파일에는 public class는 단 한 개만 존재한다.
//public class A{}

public class ClassMain extends Data{
	
	public static void main(String[] args) {
		Data d = new Data();
		ClassMain c = new ClassMain();
		//부모 클래스의 protected 필드는 다른 패키지라도 접근 가능
		//public만 접근 가능
	}
}

 

** 다른 패키지에 접근 가능한 제어자는 public 뿐이나 상속을 받는 순간 protected도 가능해진다 **

** public(모든 패키지에서 접근 가능), protected(다른 패키지에서 접근 불가하나 자식은 가능) ** 

 

** 같은 클래스 내에서는 private 빼고는 모두 접근 가능 **

 

5) 인터페이스 예제

** 아직 완성된 코드가 아님, 다음시간에 완성시키기로 함 **

** inter 패키지, Soldier 인터페이스 **

package inter;

public interface Soldier {
	//상수는 대문자로 쓰는 것이 개발자들끼리 약속!
	//final static 생략 가능
	final static int ARM = 2;
	int LEG = 2;
    
	//abstract 생략 가능
	abstract void work();
	void eat();
	void sleep();
	void salute();
}

 

** inter 패키지, Private 클래스와 pfc 클래스 **

package inter;

public class Private implements Soldier {

	@Override
	public void work() {
		System.out.println("열심히 뛰지만 결과물이 없다. 그리고 어딜 간다.");
	}

	@Override
	public void eat() {
		System.out.println("허리를 90도로 펴고 직각 식사를 한다. 그리고 어디 간다.");
	}

	@Override
	public void sleep() {
		System.out.println("고향 생각에 잠이 잘 안온다. 울다가 어디 간다.");
	}

	@Override
	public void salute() {
		System.out.println("충!!!!!!!!!!!!!!!!!!!!!!!!!!!!!성!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
	}

}
package inter;

public class Pfc implements Soldier{

	@Override
	public void work() {
		System.out.println("어느 정도 결과물이 나온다. 후임들에게 알려준다.");
	}

	@Override
	public void eat() {
		System.out.println("후임들 식판과 선임들의 식판을 보며 식사한다.");
	}

	@Override
	public void sleep() {
		System.out.println("잘 잔다. 그러다 어디 간다.");
	}

	@Override
	public void salute() {
		System.out.println("충!성!");
	}

}

'웹_프론트_백엔드 > 단과' 카테고리의 다른 글

[단과_JAVA] 2020.02.20  (0) 2020.02.20
[단과_C] 2020.02.19  (0) 2020.02.19
[단과_C] 2020.02.18  (0) 2020.02.19
[단과_JAVA] 2020.02.18  (0) 2020.02.18
[단과_C] 2020.02.17  (0) 2020.02.17