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 |