MY MEMO

[JAVA] 기본 개념 다지기 - 1 본문

STUDYING/JAVA

[JAVA] 기본 개념 다지기 - 1

l_j_yeon 2017. 10. 2. 17:47

출처 : https://programmers.co.kr/learn/courses/5


상수 선언시 : final


java에는 long long이 없음 -> long으로 사용


Casting(형변환) : type을 변환시켜줌

그냥 앞에 변환시켜주고 싶은 (형식)변수이름;


자료형 [] 배열명 = {};

배열명 = new 자료형 [개수];

배열명 = new 자료형 []{};


foreach문 예제

for(String number: numbers) {

    System.out.println(number);

}


String은 상수인 변수에 저장됨

ex) String str1 = "hello";


hello라는 instance가 상수영역에 저장되어있으면

새로운 hello를 만들지 않고 찾은 후에 instance 저장

+) Instance? 

객체를 생성하여 JVM (Java Virtual Machine 자바 가상 머신)이 

관리하는 메모리에 적재된 것을 의미합니다.


String str2 = new String("hello");

라면 상수영역에 저장하지 않음

새로 만들고 가리킴


if(str1 == str2) //메모리 주소가 같아?

if(str1.equals(str2)) //값이 같아?


+) System.out.println(str1.substring(3)); 

   //잘라서 보여주더라도 이 함수를 수행한 후 새로운 String 생성

   System.out.println(str1); //자신의 값은 변하지 않음


field : 클래스 안에서 선언되는 멤버 변수


String

1. concat : str1.concat(str2);

2. substring : str1.substring(2); //2부터 출력(당근 index는 0부터 시작)


class는 instance화 하지 않은 채로 사용될 수 없음

static이라는 키워드가 붙어있으면 -> golbal

static을 사용하면 instance화 하지 않아도 사용 가능


만약 class에 private / public / protected를 사용하지 않으면

자동으로 private으로 설정


만약 클래스 instance해서 static value의 값을 변경했으면

마지막에 변경된 것을 적용

왜? -> instance 생성 시 만들어짐 (static이 아니면)

       instance생성시 만들어지는 것이 아님 (static) -> 클래스 변수 : static한 변수, 값을 저장할 수 잇는 공간이 하나밖에 없어서 값을 공유

       따라서 instance 생성 하지 말고 그냥 class이름 쓰는 것이 좋음

main은 static함수!


생성자

class를 instance할 때 자동으로 실행되는 함수

ex)

public Car(String n){

name = n;

}

//생성자 이름은 클래스의 이름과 같게


method overloading

method이름은 같으나 매개변수의 수 타입이 다른 경우 동일한 이름으로 method 정의


생성자 overloading

method와 마찬가지로 이름은 같으나 매개변수의 수나 타입이 다른 경우 정의 가능


package

관련된 클래스를 폴더별로 관리

Domain이름을 거꾸로 적음 + project이름 붙임

(다른 회사의 프로젝트와 중복되는 것을 방지)

package가 있는 class를 사용할 때에는 import 사용

ctrl+shift+o


상속

extends!

public class 클래스명 extends 부모 class명

부모 class의 method와 변수를 사용할 수 있음

부모는 자식의 class를 사용할 수 없음


캡슐화 : 관련된 내용을 모아서 가지고 있는 것


접근제한자

public : 넓은 의미로 모든 것이 접근 가능 (개방)

protected : 같은 package에 있는 것들에게는 공개

      다른 package에 있더라도 상속해줬으면 ok

private : 자기 자신만 접근 가능

아무것도 적지 않는다면 default!

: 자기 자신과 같은 package 내에서 접근 허용


public > protected > default > private


+) abstract와 interface의 차이 : http://marobiana.tistory.com/58


추상 클래스 (abstract)

딱 정할 수 없는 모호한 class

ex) 새

오리 : 꽥꽥

새 : 짹짹

모두 다름 -> 추상 클래스로 생성한 이후 public abstract class 이름

extends를 해서 받아온 다음 

자식 class에서 추상 class를 정의

정의할 때에는 abstract쓸 필요없이 그냥 public void ~ 이렇게 쓰면 됨


method가 하나라도 추상메소드인 경우 해당 클래스는 추상 클래스

추상 클래스 내부에 일반 메소드 생성 가능


+) 추상 클래스는 직접 사용할 수 없음! -> 꼭 상속을 해야


super class

A class와 B class가 있다 A가 B를 상속했다고 할때

A class를 실행하면 자신의 부모 -> 자신 순으로 출력된다

(A의 생성자에는 super()라는 것이 생략되어 있었던 것!)

ex) 내가 태어나기 위해서는 나 이전에 부모가 태어나야함


super : 부모를 나타내는 키워드


Overriding

부모가 가지고 있는 method와 자식이 똑같은 것을 가짐

부모의 method를 자식이 다시 정의해서 사용

자식 class에서 부모의 method 호출 가능

super.functionname();


2. static 메소드는 클래스에 속하는 메소드이기 때문에 상속이 안 된다.

3. 접근 제한자가 private 으로 정의된 메소드는 상속 자체가 안 된다.

4. interface 를 구현해서 메소드를 오버라이딩 할 때는 반드시 접근 제한자를 public 으로 해야 한다.

5. 메소드의 인자의 갯수와 타입이 완전히 일치해야 하고, 리턴 타입도 같아야 한다. 인자의 이름은 상관없다.

6. 부모 클래스의 메소드의 접근 제한자보다 좁아질 수 없다. 확장될 수는 있다.

7. 부모 클래스의 메소드보다 더 많은 예외를 던질 수 없다.

8. final 예약어가 지정된 메소드는 오버라이딩 할 수 없다.


클래스 형변환

부모타입이 자식타입을 가질 수 있음

Car (부모) -> Bus (자식)

Car c = new Bus(); //가능 -> 부모가 가지고 있는 method만 사용 가능


Bus (자식) -> Car (부모);

ex) Bus bus = (Bus) new Car();


car.getClass().getName() -> 자신의 자식 method의 이름 가져옴


interface(인터페이스)

구현을 하지 않고 기능들을 가지고 있는 것을 interface라고 한다

interface는 함수를 구현해 놓지 않고

이 interface를 어떤 새로운 객체가 implement를 하여 사용한다

TV (interface) -> LedTv(Class)

ex)

//interface도 객체 타입이 될 수 있음

TV tv = new LedTv();

tv.turnOn();

interface를 만들어 놓으면 그 종류에 맞게 함수 내용을 변경 가능하므로 유용!


interface default method

1. default method

2. static method

//interface class 안에서

default int 함수 이름() -> method 구현이 가능

static method 또한 구현이 가능

-> interface명.static함수의 이름


내부 클래스 (class안에 class)

1) 중첩 클래스, instance class

필드를 선언하는 위치에 class를 선언


내부 클래스를 사용하기 위해서는

내부를 둘러싸는 class 먼저 선언

외부 클래스.new 내부 클래스();


2) static class

외부 클래스를 선언하지 않아도 바로 static을 쓸 수 있음

외부클래스.내부클래스 별명 = new 외부클래스.내부클래스();


3) 지역 class (local class)

class안에 method

그 method 안에 class 정의

class는 method안에서만 정의 가능 -> class안의 method 사용 가능


4) 익명 중첩 class

//method를 구현하거나 method를 추가할 수도 있음

Action action = new Action(){

@Override

public void exec(){

System.out.println("exec");

}

};


action.exec();



Exception

try{} //예외가 발생할 수 있는 코드

catch(){} //예외 처리 블록

finally{} //예외 발생 여부에 상관없이 반드시 실행 (생략 가능)


throw

함수명 throws Exception,ClassCastException{

//함수 발생시 오류가 생기면 method를 호출한 쪽에서 오류를 처리해주세요


강제로 exception 발생시키기

throw new exception이름("");


사용자 정의 Exception

사용자가 직접 Exception을 정의해서 사용할 수 있음

public class 이름 extends Exception{}

//직관적으로 Exception이 어떤 것이 나왔는지 알 수 있도록 하기 위해

오류 처리를 하지 않으면 Compile Error / Runtime Exception


public class 이름 extends RuntimeException{

public 이름(String msg){

super(msg);

}

public 이름(Exception ex){

super(ex)

}

}


이걸 사용할 때에는

class안에 method 구현시

public void method이름(매개변수) throws 이름(위에서 정의한 Exception이름){

if(i<0) throw new 이름("");

}


Ex) 


public class ExceptionExam{

  public static void main(String[] args){

    ExceptionExam exam = new ExceptionExam();

    int[] array = new int[10];


    try{

    exam.get50thItem(array);

    }catch(MyCheckedException e){

System.out.println(e.toString());

    }

  }


  public int get50thItem(int []array) throws MyCheckedException{

    if(array.length < 50){

      throw new MyCheckedException();

    }

    return  array[49];

  }

}

'STUDYING > JAVA' 카테고리의 다른 글

[JAVA] Version 관련  (0) 2018.02.09
[JAVA] Set List Map Vector Properties 예제  (0) 2017.10.20
[JAVA] 기본 개념 다지기 - 2  (0) 2017.10.16
[JAVA] JAVA로 게임 만들기 (환경 설정)  (0) 2017.06.09
[JAVA] 상속  (0) 2017.06.02
Comments