생성자는 리턴 타입이 없다.*

 

생성자에 따로 호출하지 않으면 조상의 기본 생성자로 호출된다.  생성자가 따로 호출되지 않으면 처음에 자동으로 생성자 호출( 무조건 처음 )  생성자의 의미가 초기화기 때문에.
에러가 난다, 기본 생성자는 원래 자동으로 만들어지는데 생성자는 여러 형태로 있을 때는 자동으로 만들어주지 않는다. 즉. 오버로딩 된 생성자가 있다면 기본 생성자는 만들어주지 않고 부모에서 기본 생성자가 없기 때문에 오류가 난다.

 

자바 이름의 형태

특수문자 $,_만 가능하다. (중간에는 어떤 특수문자든 상관없나..? 셤공부할 때 확인해보기 ) 

$jungwon.java // _jungwon.java

숫자로 시작하는건 불가능하다.

// 1z.java(불가)  

예약어는 불가능하지만 대문자로 쓰면 예약어가 아니기에 가능하다. (키워드는 되나 근데? 해보기 ) 

// If.java(가능) // if.java(불가)  

 

데이터 타입 

* 기본 타입은 8개 ( boolean, byte, int, short, long , char, float, double) 
* 참조 타입은 class, interface, array, String 등이 있고 객체의 번지를 참조하고 Heap 영역에서 만들어짐. 

* short, byte, char는 +연산이 붙으면 int로 자동 형변환이 된다.

이를 유의해야함. 

* long 뒤엔 L, float뒤엔 f붙는다

기본 문법 

* Math.ceil = 올림

* Math.floar= 내림. 

* Math.round= 반올림. 

* switch break~  (case: 해당) 실행되고 break가 없으며 나머지 case와 default까지 다 실행)

* 클래스 배열 생성 형태 

* 문자와 숫자 형변환 및 2차원 배열의 크기 문제 

배열의 크기 or 형변환 관련 

* valueOf와 parseInt와 차이점 

valueOf = 객체 반환.  parseInt = 기본형 반환. 

* equals 와 ==의 차이? 
equals는 객체(=값)을 비교 , == 는 주소를 비교.  

* 연산자 다중 정의도 지원하지 않고 define,  typedef이런거 안쓴다. 
 a >> 2  = a *(1/4) 
 a << 3  = a *(2^3) 

collection

Collection의 종류 ? Set, List, Map 등이 있다. //stack, vector도 있음. 
모두 인터페이스라 객체로 생성할 순 없고, 각각 특징이 다르다. 
Map은 키와 벨류를 가지는 해쉬 테이블 처럼 사용. 
List는 일반적으로 Linkedlist, arraylist가 있다. 
arraylist : 배열로 되어있기 때문에 추가, 삭제가 많은 경우 Linked 리스트보다 성능이 안좋고 메모리 낭비가 많다. 또 배열을 늘려 주기 위한 연산이 추가로 들어간다. 
Linkedlist : 추가 삭제가 용이함. 검색이나 접근에 있어서는 arraylist가 훨씬 빠르다. 
Set: 중복이 없고 treeSet의 경우에는 정렬까지 가능하다. 
 

제네릭 

public , protected, default ( 동일패키지 , 클래스 내부 ) ,private 

추가 공부 필요 부분.

instanceof

예외처리

키워드? 뭐였더라 무튼 그런 이름 있잖아.

final

java lang과 util

멤버변수 ( 스태틱, 인스턴스 ), 지역,매개변수

* 멤버 변수와 메소드의 저장 위치는 다른 것인가? 

 

 

기타 지식
자바에서 int value; 라고 되어 있다면,  0으로 초기화되어있는 것이다.
*객체 지향 언어: java, c++, python pascal(다형성 지원 x ), c#, objective-c 
*Python : 높은 효율, 쉬 사용, 확장성 ( 인터프리터 식 대화형 언어 ) 

 

*서버 언어 : ASP, JSP, CGI, PHP 
*클라이언트 언어 : javaScript , VBScript 등이 있음. 


*고급언어의 컴파일 단계 
어휘분석( token 단위로 분리 ) -> 
구문분석(어희의 에러를 찾고 에러가 없는 문장을 구문 구조로 구성) -> 
의미분석(의미오류를 검사) -> 코드 최적화 -> 목적코드 생성 . 

 

참고 문헌

유상통_상속_문제 풀이 인강 좋다
https://youtu.be/5ohUT4LEOWI
유상통_인터페이스_문제 : 8:11
https://youtu.be/dsF4g0lvXIY

자바_연습문제 

https://baejino.com/javaessential/5

https://studymake.tistory.com/416

서울위즈_JAVA_JSP_SPRING_강의

https://www.youtube.com/playlist?list=PLieE0qnqO2kTyzAlsvxzoulHVISvO8zA9

 

*오버라이딩, 오버로딩을 다형성이라고 함. 
오버로딩 정의

오버로딩 : 하나의 클래스내에서 같은 이름의 메소드나 생성자를 여러개 가지면서 매개변수의 유형과 갯수를 다르게 한다.

오버로딩 설명.

리턴 타입과 매개변수의 이름은 오버로딩에 영향을 주지 않는다. 

예시) 매개변수 타입이 같은데 리턴 타입만 다른 경우는 성립되지 않음.
long garden( int a, int b) , int garden( int a, int b) => 어디로 들어가야할지 모르기에 성립이 안된다.

 

오버라이딩 정의

오버라이딩: 상위 클래스(부모)가 가지고 있는 메소드를 하위 클래스(자식)가 재정의 하여 사용하는 것을 의미합니다. 

오버라이딩 설명. 

부모 A, 자식 B라고 할때

B는 " 오버라이딩 해서 나는 아버지 처럼 살기 싫어 " 해서 자기꺼대로 바꿔 쓴다. 
근데 A ab = New B(); 이렇게 되면, 부모객체로 만들긴 하지만 껍데기는 B이기 때문에 오버라이딩은 하지만, 
부모가 가진 메소드만 쓸수 있다. 그 외에 꺼는 못씀. 
but) 인생엔 언제나 예외가 있잖아.  static이 그 예외야. 
A에 static void f가 있고 B에도 f가 있다면, 부모꺼를 써야한다. 
A에 그냥 void f가 있고 B에도 f가 있었다면, 자식f를 써야한다. 

 

다형성이란? 
오버로딩과 오버라이딩 처럼 하나의 지시에 여러 객체가 각자 다른 행위를 수행할 수 있도록 만든 것을 다형성으로 알고 있습니다. 

 

오버라이딩 예시

오버로딩 예시

예외처리에서의 오버라이딩 

예외처리 ( try, catch, finally )

=> try : 최소한 하나의 catch 블록이 있어야 실행 

=> catch: 갯수 무제한. 

=> finally 마지막에 실행 ( 있으면 무조건 실행, 필수 블록은 아님)

 

추상클래스와 인터페이스 


추상( 반드시 오버라이딩해서 사용할  미완성 메소드가 적어도하나 이상 가진 미완성 클래스 ) 
즉, 완성된 메소드도 가질 수 있다. 미완성인건 abstract void ~이런식으로 씀. 
인터페이스 ( 여긴 전부다 미완성 된거 씀, 모두 재정의 필요 ) 
즉, 완성 된거 있으면 오류남. 

문제1 ) 추상클래스는 객체 생성 불가능하다. 

=> 미완성된 메소드가 있는데 어떻게 객체를 생성합니까?  그니까 안되지. 

문제2 ) 인터페이스의 특징이 아닌것? 
1. 인터페이스는 계층 관계를 이룰수없다. (X)
계층관계란 상속을 말하고 인터페이스 끼리도 상속이 가능하다. 
2. 인터페이스 내부에는 메소드 구현이 안되어있다(O)
3. 인터페이스 내부에는 인스턴스 변수 선언이 포함될 수 없다. 
4. 인터페이스는 객체를 만들 수 없기 때문에 생성자를 가질 수 없다.(O)
*인터페이스는 서로 관련없는것도 연결지어 줄 수 있다.

*다중 상속이 가능해진다. 

*독립적인 프로그래밍이 가능해진다. 

 

상속 

root 

 |   |

A   B 

 |   |

C   D

형태라면 ? Root r = new A,B,C,D()가능하다. 

A = new C() 가능 

A = new root() 불가능 // 부모가 자식을 만들 순 있지만 제약이 따름.

C = new A,root() 불가능. //자식이 부모를 만들 순 없음.

 

Animal.java
public class Animal {
    String name;

    public void setName(String name) {
        this.name = name;
    }
}
Dog.java
public class Dog extends Animal {
    public void sleep() {
        System.out.println(this.name+" zzz");
    }

    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.setName("poppy");
        System.out.println(dog.name);
        dog.sleep();
    }
}

https://hyeonstorage.tistory.com/186 이거 무조건 봐라 ( 객체 타입 ) 
부모타입 = 자식객체 ( 오버라이딩해서 메소드 씀) 
즉, 자식 메소드 사용, 부모 변수 사용 

 

IS-A 관계

Dog클래스는 Animal클래스를 상속받았다. 즉, Dog는 Animal의 하위 개념이라고 할 수 있겠다. 이런 경우 Dog는 Animal에 포함되기 때문에 "개는 동물이다"라고 표현할 수 있다.

자바는 이러한 관계를 IS-A 관계라고 표현한다. 즉 "Dog is a Animal" 과 같이 말할 수 있는 관계를 IS-A 관계라고 한다

 

Animal dog = new Dog(); //개(설계도)로 만든 객체는 동물 자료형이다

Dog dog = new Animal();  
// 컴파일 오류: 부모 클래스로 만든 객체는 자식 클래스의 자료형으로 사용할 수 없다.
// 자식 자료형 X = new 부모클래스(); // 부모(설계도)로 자식의 자료형을 만들 수 없다. 
//
Animal dog = new Dog();
// 부모 자료형으로 만든 개는 개의 설계도로 만들었다. 

즉, 부모 자료형으로 dog1을 만들지만, 자식 설계도이다. 그래서 자식만 가지고 있는 sleep을 쓰면 컴파일 에러가 난다. 이때 형변환을 해주면 쓸 수 있다. 

 

 

즉, 부모 타입 A = new 자식 , 부모() 만 가능하다. 

Root r = new 1,2,3,4() 된다. 로 외우자. 

상속의 완전한 이해 완료.. 

하지만, 아직 멤버객체에 대한 이해 필요.

 

 

객체변수(인스턴스 및 클래스 변수)는 오버라이딩 되지 않는가? 네, 객체 타입을 따라갑니다. 

https://kldp.org/comment/512939#comment-512939

재밌는 코드 공유 

 

java 클래스 상속시 멤버 변수를 오버라이드 | KLDP

아래와 같이 3개의 클래스를 만든 후 Main 클래스의 main 함수를 호출하면, 기대한 대로 동작을 하지 않네요. 뭔가 제가 잘못 이해하고 있었는지도 모르지만... 기대값은 this is b인데 결과는 this is a이네요. 그냥 상속을 하더라도 부모 클래스의 메소드이니 해당 클래스의 멤버 변수가 참조된다.. 라고 외워버려도 되긴 하겠지만 정확한 설명을 할 수 있으신 분의 도움을 부탁드립니다. public class A { String a = "thi

kldp.org

인스턴스 변수는 heap에 생긴다. 

일단은 부모의 변수는 오버라이딩 되지않고 부모의 것을 취한다라고 이해했다. 
http://superjang.com/archives/3095 나름 잘 설명했다. 

 

public class jungwon {
   static class A 
   {
      int d = 1; 
      int method() {
         return 3;
      }
   }
   static class B extends A 
   {
      int d = 2;
      int method() {
         return 3;
      }
   }
   static class C extends B 
   {
      int d = 3;
      int method() {
         return 3;
      }
   }   
   public static void main(String[] args) {
      A a = new C(); 
      B b = new C();
      C c = new C();
      System.out.println(a.method() + b.method() + c.method());
      System.out.println(a.d + b.d + c.d);
   }
}

정답은: 9 , 6이다. 
// 변수는 참조타입을 따른다. 

public class Animal {

}

 Animal 클래스는 가장 간단한 형태의 클래스이다. 클래스의 선언만 있고 내용이 없는 껍데기뿐인 클래스이다. 하지만 이 껍데기뿐인 클래스도 아주 중요한 기능을 가지고 있다. 그 기능은 바로 객체(object)를 만드는 기능이다. 

객체는 다음과 같이 만들 수 있다.

Animal cat = new Animal();

new 는 객체를 생성할 때 사용하는 키워드이다. 이렇게 하면 Animal 클래스의 인스턴스(instance)인 cat, 즉 Animal의 객체가 만들어진다.

 

※ 객체와 인스턴스

클래스에 의해서 만들어진 객체를 인스턴스라고도 한다. 그렇다면 객체와 인스턴스의 차이는 무엇일까? 이렇게 생각 해 보자. Animal cat = new Animal() 이렇게 만들어진 cat은 객체이다. 그리고 cat이라는 객체는 Animal의 인스턴스(instance)이다. 즉 인스턴스라는 말은 특정 객체(cat)가 어떤 클래스(Animal)의 객체인지를 관계위주로 설명할 때 사용된다. 즉, "cat은 인스턴스" 보다는 "cat은 객체"라는 표현이 "cat은 Animal의 객체" 보다는 "cat은 Animal의 인스턴스" 라는 표현이 훨씬 잘 어울린다.

 

과자를 만드는 과자틀과 만들어 진 과자들이다.

  • 과자틀 → 클래스 (Class) // 설계도.
  • 과자틀에 의해서 만들어진 과자들 → 객체 (Object)

즉, 다음과 같이 무수히 많은 동물 객체(cat, dog, horse, ...)들을 Animal 클래스로 만들 수 있는 것이다.

Animal cat = new Animal();
Animal dog = new Animal();
Animal horse = new Animal();
public class Animal {
    String name; // 객체 변수라고 부른다. 또는 인스턴스 변수, 멤버 변수, 속성
}

즉, 클래스에 의해 생성되는 것은 객체, 그리고 그 클래스에 선언된 변수는 객체 변수라고 생각하면 쉽다.

 

다음으로 객체 변수를 만들었으니 이제 객체 변수를 사용해 보도록 하자. 먼저 객체 변수는 변수이므로 값을 대입할 수 있을 것이다. 대입하기 전에 객체 변수는 현재 어떤 값을 가지고 있는지 먼저 출력 해 보도록 하자.

객체 변수를 출력하려면 객체 변수에 어떻게 접근해야 하는지를 먼저 알아야 한다.

객체 변수는 다음과 같이 도트연산자(.)를 이용하여 접근할 수 있다.

 

객체.객체변수

public class Animal {
    String name;

    public static void main(String[] args) {
        Animal cat = new Animal();
        System.out.println(cat.name);
    }
}

//결과는 null이다.

cat.name을 출력한 결과값으로 null이 나왔다. null이라는 것은 값이 할당되어 있지 않은 상태를 말한다.

객체 변수로 name 을 선언했지만 아무런 값도 대입을 하지 않았기 때문에 null 이라는 값이 출력된 것이다.

 

 

+ Recent posts