1. Static Methods의 목적

 1) 생성자 없이 사용 할 수 있다.

 public class StaticDemo {
 public static void main(String[] args){
  Demo[] d = new Demo[5];
  for (int i = 0; i < d.length; i++) {
   d[i] = new Demo();
  }
  System.out.println(d[0].su);
  System.out.println(d[0].num);
 }
}
class Demo{
 int su;
 static int num;
 public Demo(){
  su++;
  num++;
 }
}

 Static 변수인 num만 증가하고 su는 따로 객체를 만들기 때문에 5개의 1이 생긴다.

 

2. Static Initializers (스태틱변수 초기화)

 1) 스테틱 메모리 접근.

 public class StaticDemo1 {
 private static int su = method(); //static 멤버가 가장 먼저 메모리에 올리오기 때문에 main() 보다 method()가 먼저올라온다.
 public static void main(String[] args){
  System.out.println(su);  
 }
 private static int method(){
  System.out.println("i'm method");
  return 1000;
 }
}

 

 2) 맴버변수는 생성자가 초기화 / 스태틱변수는 스태틱 블록이 초기화 한다.

public class StaticDemo2 {
 private int su;
 private static int num;
 public StaticDemo2(){
  System.out.println("나는 생성자");
  su=10;
 } 
 public static void main(String[] args) { 
  System.out.println("나는 메인");
 }
 static{
  System.out.println("나는 스태틱 초기화 블록");
  num = 100;
 }
}

 가장 먼저 스태틱 초기화블록이 실행되고 메인이 실행된다. 스태틱 초기화블록은 최초 한번 실행되고

 

 

3. Final

 1) Final 상수 역시 생성자에서 초기화 할 수 있다.

 2) Final Methods

 

4. Deprecation

 1) java가 버전업 되면서 수정되거나 업데이트 된 클래스나 메소드를 호출 할 때 표시된다.

 2) ex : Date => Calander

 

5. Inner Classes

  1) Nested Class (Static class, 중첩클래스)

   - why : static class 를 사용해 패키징화 하기 위해 사용한다. (new 로 생성 할 필요없이 접근 가능)

   - 생성방법 : Outer.Inner in = new Outer.Inner();

   - 제한사항 : Outer의 member변수, member 메소드는 사용할 수 없다. (생성한 후 사용 가능)

 
public class NestedClassDemo {
 public static void main(String[] args) {
  Outer.Inner in = new Outer.Inner(); // Outer를 생성하지 않아도 static인 Inner에 접근가능.
  in.method1();
 }
}
class Outer{
 private int a;
 public int b;
 public Outer(){   //outer class constructor
  this.a = 5;   this.b = 10;
 }
 public static void method(){  //outer class method
  System.out.println("나는 스태틱");
 }
 static class Inner{
  private int c;
  public int d;
  public Inner(){
   this.c = 5;
   this.d = 10;
  }
  public void method1(){
   Outer out = new Outer();
   System.out.println("a ="+out.a); //static은 멤버에 접근 불가능. 주소를 가져야 하기때문에 생성자 필요
   method();  //static은 static에 바로 접근이 가능하다.
  }
  public static void method2(){}
 }
}

 

 2) Member Class

   - why : 다중 상속을 하기위해 사용한다.

   - 생성방법 : Outer.Inner in = 바깥주소.new Inner();

   - 제한사항 : Inner는 static 변수, static 메소드를 가질 수 없다.

 public class MemberClassDemo {
 public static void main(String[] args) {
  Outer1 out = new Outer1();
  Outer1.Inner1 in = out.new Inner1();
 }
}
 class Outer1{
 private int a = 5;
 private static int b= 10;
  class Inner1{
   private int c = 100;
 //  public static int d =4; //static 변수 사용 할 수 없다.
   public void method(){
    System.out.println("a="+a);
    System.out.println("b="+b);
   }  
 }
}

 

 3) Local Class

   - why :

   - 생성방법 :

   - 제한사항 : 메소드 속에서는 절차적이기 때문에 순서가있다. / public, private,protected 접근자 사용불가 / static 사용 불가 / 로컬클래스가 속해있는 메소드의 지역변수를 사용할 수 없다( 지역 상수는 사용 가능하다)

 public class LocalClassDemo {
 public static void main(String[] args) {
  Outer2 out = new Outer2();
  out.method();
 }
}
class Outer2{
 private int a= 5;
 private static int b = 10;
 public void method(){
  int c = 100; //메소드의 지역변수
  final int c2 = 100;  //지역 상수
  class Inner2{
   private int d = 100;
   public Inner2(){
    System.out.println("나는 생성자");
   }
   public void display(){ 
    System.out.println(a+b+d);
   // System.out.println(c);  // 사용 불가
    System.out.println(c2); //사용가능
   }
  }
  Inner2 in = new Inner2(); // method() 내에서는 순차적으로 처리된다.(Inner2를 알고있어야 생성가능)
  in.display();
 }
}

 

4) Anonymous Class

   - why : 상속 관계가 아니어도 Overriding 할 수 있다.

   - 생성방법 :

   - 제한사항 :

 public class AnonymousClassDemo {
 public static void main(String[] args) {
  Super s = new Super(){
   public void display(){
    System.out.println("hello22");
   }
  };
  s.display();
 }
}
class Super{
 public void display(){
  System.out.println("hello");
 }
}

 

 

6. Enum

 1) 고정된 갯수의 나열을 갖는 데이터를 갖는다.

 2) 데이터 형이 없다.

 3) 선언될 상수가 가장 윗줄에 작성되어야 한다.

 4) 생성자는 public을 사용 할 수 없다.

 public class EnumDemo {
 public static void main(String[] args) {
  for (Subjects s : Subjects.values()) {
   System.out.print(s+"-->");
   System.out.print(s.ordinal()+"==>"); //나열순서 출력
   System.out.print(s.get()+"==>");
   System.out.println(getInfo(s));
  }
 }
 static String getInfo(Subjects s){
  String info = null;
  switch(s){
  case JAVA : info ="열정" ; break;
  case JDBC : info ="Oracle" ; break;
  case JSP : info ="Javascript" ; break;
  case Android : info ="SmartPhone" ; break;
  case Project : info ="Idea" ; break;
  }
  return info;
 }
}

 public enum Subjects {
 JAVA(1), JDBC(10), JSP(100), Android(1000), Project(10000);
 Subjects(int v){ //생성자는 public 사용 안됨.
  this.v = v;
 }
 private final int v;
 public int get(){
  return this.v;
 }
}

 

추상화

 

1. Abstract Methods 추상 메소드  (Override의 강제성을 주기위해 사용한다)

 1) 바디를 정의하지않는 메소드로 상속해 줄 수 있으며 이를 상속 받은 클래스는 반드시 재 정의 해야한다.(Overriding)

 public class AbstractDemo {
 public static void main(String[] args) {
  Jasic j = new Jasic();
  j.display();
 }
}

abstract class Bumo{  // abstract 메소드를 가지고있는 클래스 역시 absract로 선언.
 abstract void display(); // 바디를 정의하지않는 메소드는 앞에 abstract를 선언해야한다.
}
class Jasic extends Bumo{
 void display(){
  System.out.println("son");
 }
}

 

2. Abstract Class 추상 클래스

 1) new로 생성할 수 없다. (인스턴스화 할 수 없다, 메모리에 올릴 수 없다)

 2) abstract 메소드가 없는 정상적인 Class  역시 Abstract로 선언 할 수 있다.

 

3. Interface : implements로 상속(구현한다)받는다.

 1) public abstract static 을 생략한 클래스라고 생각하면된다.

 2) interface속의 변수는 public static final이 생략되어있다. 따라서 모두 초기화를 해야한다.

 3) interface의 메소드는 public abstract가 생략되어있다.

 4) interface의 하위클래스는 반드시 메소드 재정의 해야한다.

 5) extends를 먼저 선언한후 implements를 쓴다. 

 6) 하위 클래스에서 인터페이스의 메소드를 재정의할 때 반드시 public을 써야한다.

 7) Interface Type의 레퍼런스변수는 해당 인터페이스 리소스만 접근가능.

 8) Interface Type의 배열을 생성할 수 있는데, 이는 interface자식들의 주소를 받을 수 있는 수첩이다.

 9) Interface속에있는 변수는 클래스변수이기 때문에 interface이름으로 접근한다.

 

4. flag interface : 멤버가 하나도 없는 인터페이스

 1) ex : clone() 사용.

   - Cloneable : 모든 클래스가 값을 복사 할 수 있는 권한이 없다. 그래서 권환을 확인하는 인터페이스.

 public class CloneDemo {
 public static void main(String[] args) {
  Demo original = new Demo(5);
 // Demo copy = original; //주소복사
 // Demo copy = (Demo)original.clone(); //사용할 수 없음.
  Demo copy = original.copy();
 }
}
class Demo implements Cloneable{ // 멤버가 없는 인터페이스 이지만 상속 받을 경우 copy권한을 얻게된다.
 private int su;
 public Demo(int su){
  this.su = su;
 }
 public void set(int su){
  this.su = su;
 }
 public int get(){
  return this.su;
 }
 public Demo copy(){
  Object obj = null;
  try {
   obj=clone();
  } catch (CloneNotSupportedException e) {
   System.out.println("복제 실패함");
  }
  return (Demo)obj;
 } 
}

 

 

5. Package

 1) class를 묶는 단위. (보통 도메인을 사용하여 com.javasoft.lib.Demo 형식으로 작성한다)

 2) cmd 에서 컴파일 할 때 -d 옵션으로 경로를 설정해야한다.

 javac–d D:\project\first Employee.java

 3) 클래스 패스 설정 : 변경되지 않는 경로를 가지고있다면 환경변수에서 지정하면된다.

 4) jar 파일 만들기. (유닉스의 tar과 같다.)

   - 압축 상태의 클래스파일들을 사용할 수 있다.

   - jar파일의 경로를  import하여 사용 할 수 있다.

 5) eclipse 에서 외부 jar 가져오기.

   - 프로젝트 선택 마우스오른쪽 -> build path -> add Archive..

 6) 도스와 eclipse 환경에서의 Package 접근이 약간 다르다. (

 public class Resume {
 private int a =5;
 int b = 10; // default는 하위 클래스도 접근 불가능
 protected int c = 100;  //상속되며 하위 클래스를 통해 접근이 가능
 public int d =5000; //다른 패키지에서도 접근 가능.
}

 

 

6. Import static

import static java.lang.System.*;
import static java.lang.Math.*;  //or import static java.lang.Math.random    메소드뒤에 ()까지 쓰면 안된다.

public class StaticImportDemo {
 public static void main(String[] args) {
  out.println("hello,world");  //System 클래스를 import했기때문에 쓰지않아도 된다.
  int r = (int)(random()*10+1);
 }
}

 

 

  

 

 

 

ps-------------------------------------------------------------------------------------

1. absract 와 final은 상극

2. this()와 super()는 상극

3. shallow copy : 주소복사 / deep copy : 값복사

1. 객체지향의 주요 특성.
 1) 추상화 (Abstraction)
 2) 캡슐화 (Encapsulation)
 3) 상속화 (Inheritance)
 
 4) 다형성 (Polymorphism)
     1. Primitive Type
      1) implicit conversion
      2) explicit conversion
     2. Reference Type
      1) 서로 다른 객체는 강제적, 암시적 형변환 안된다.

 public class CastDemo {
 public static void main(String[] args) {
  Test td = new Test();
  Demo d = new Demo();
  td = (Test)d;  // 오류
 }
}

class Test{
 int su = 5;
}
class Demo{
 String name = "taehyung";
}


      2) 자식 --> 부모로 형변환 : 강제적, 암시적 모두 성공한다.
      3) 부모 --> 자식으로 형변환 : 강제적 형변환만 가능하고, 런타임 때 오류발생가능 (반드시 instanceof()로 검증해야한다.)

 public class CastDemo {
 public static void main(String[] args) {
  Test t = new Test();
  Demo d = new Demo();
  t = d;   //자동 형변환
  t = (Test)d;  // 강제 형변환
 }
}
class Test{
 int su = 5;
}
class Demo extends Test{  // 상속
 String name = "taehyung";
}

 public class CastDemo {
 public static void main(String[] args) {
  Test t = new Test();
  Demo d = new Demo();
  d = t;  // 자동 형변환 오류
  d = (Demo)t;  //강제 형변환은 된다
 }
}
class Test{
 int su = 5;
}
class Demo extends Test{
 String name = "taehyung";
}
 public class CastDemo {
 public static void main(String[] args) {
  Test t = new Test();
  Demo d = new Demo();
  if (t instanceof Demo) d = (Demo)t;
  else System.out.println("cannot");
 }
}
class Test{
 int su = 5;
}
class Demo extends Test{
 String name = "taehyung";
}
 자식 --> 부모  부모 -->자식  부모 --> 자식(instanceof())
 
 
 
 
ex) 포유류 형을 상속받은 개나 고양이 들의 형태를 다시 포유류로 형변환이 된다.

 void display(int choice){
  Mammal m = null;   // 경우에 따라 자식의 형태가 부모형으로 변환되어 들어간다.
  switch (choice) {
  case 1: m = new Dog();   break;
  case 2: m = new Cat();  break;
  case 3: m = new Korean();  break;
  case 4: m = new American();  break;
  default:System.out.println("누구냐 넌,"); break;
  }
  m.saySomething();  // 각 종족에 따른 울음소리를 실행하는 메소드

 

ex2) 카센터 자동차 수리

 public class CarCentar {
 public static void main(String[] args) {
  CarCentar cc = new CarCentar();
  Matiz m = new Matiz("마티즈");
  Carnival c = new Carnival("카니발");
  Sonata s = new Sonata("소나타");
  cc.repair(m);
 }
 void repair(Car c){   //부모형 변수에 자식들의 입력을 자동으로 받는다.
  if (c instanceof Sonata) { // 형태를 검사한다.
   System.out.println("현대차 ");
  }else if(c instanceof Matiz){
   System.out.println("대우차 ");
  }else if(c instanceof Carnival){
   System.out.println("기아차 ");
  }  
  System.out.println(c.getName()+" 수리완료!"); //들어온 형태에 상관없이 getName메소드를 사용할수있다.
 }
}

 

 

 

 

 

 

ps -------------------------------------------------------------------------------     

1. 1) tightly coupled(Early Binding) : 컴파일 때.

   2) loosely coupled(Late binding) : 런타임 때

 

 

2. Overriding 할 때 자식은 부모보다 권한이 작으면 안된다.

 private < default < protected < public

 

1. 객체지향의 주요 특성.
 1) 추상화 (Abstraction)
 2) 캡슐화 (Encapsulation)

 3) 상속화 (Inheritance)
  - 자바는 단일 상속으로 1개의 상위 클래스로부터 상속받을 수 있다. (역학 조사로 Maintanance에 좋지만 현실적으로 단일 상속을 사용하지 않는다. extends는 한번 사용하지만, 인터페이스(가상클래스)를 활용한다.)

 

C++ 

Java 

C# 

부모

 Base

Super 

base 

 표현

  :

 extends 

 

 자식

 Derived

 다중상속

 sub

단일상속

 

 

 
  - TwoD extends ThreeD : 생성자로 TwoD를 생성할때 먼저 부모클래스인 ThreeD를 메모리 heap에 올린다.
  - 자식 주소로 부모를 접근하면 상속, 부모 주소로 자식을 접근하면 다형성 이다.
  - class와 class, interface와 interface 간에는 extends, class와 inteface는 implements(동종간에는 extends,이종간에는 implements)
  - 관계    
    i) "is a"  : ex) 오토바이 -> 탈것
    ii) "has a"  ex) 주방 -> 냉장고
  - 상속이 되지 않는 것.
    i) private 선언 된 것은 상속되지않는다.
    ii) static 역시 상속되지 않는다.
    iii) 생성자는 상속되지 않는다.
       - 자식이 부모를 생성하려면 this메소드와 같은 형식의 super()를 사용한다. (마찬가지로 첫줄에 쓴다)
    iV) Overshadow 변수(클래스 변수와 같은 이름의 변수를 사용), Override 메소드 는 상속되지않는다. 자식 것을 쓴다.
       - super()를 사용하여 해결 할 수 있다.
       - String 형은 자체적으로 static 이기 때문에 this()나 super()이용해 접근할 수 없다.
 4) 다형성 (Polymorphism)

 
 
 
ps.----------------------------------------------------------------------------------------
- Object는 모든 객체들의 필수 요소의 집합이다. (원형이다.)
 
- 객체 비교에 대하여
   1. ==, !=
     1) value type -> 값비교, (su==num)
     2) Reference type -> 주소비교
     3) String type --> 값비교(new 없을 때), 주소비교(new 사용) //보통 String은 equals()를 사용한다.
   2. equals()
     1) value type --> 해당없음 (su.equals(num))
     2) Reference type --> 주소비교
     3) String type --> new와 관계없이 값비교
 

+ Recent posts