본문 바로가기

개발/정리라고 할까나

자바 공부 텍스트로 정리

클래스를 생성할  

New 생성자를 호출하는 역할을 한다 

Reference 객체는 new 라는 키워드를 통해서 연결되어 있다. 

New 라는 키워드를 이용해서 동적으로 객체를 생성한 다음 대입 할당 연산자를 통해서 연결하게 된다. 

Obj obj1 = new Obj();

여기서 obj1 Reference, 참조변수가 된다.


New 클래스에 만들어진 생성자를 호출한다 

생성자는 호출될 메모리에 올라간다


obj1.color = “red”; 라고 하는 . 도트 접근자 통해서 가능하다




멤버참조연산자(.)

클래스의 멤버를 참조할 때는 멤버참조연산자(.) 사용한다


생성자

생성자는 인스턴스가 생성될 호출되는, ‘인스턴스변수들을 초기화하는 메서드이다. 따라서 인스턴스 변수들의 초기화 작업에 주로 사용되며, 인스턴스 생성시에 실행되어야 작업을 위해서도 사용된다.

  • Card c = New Card();
  1. 연산자 New 의해서 메모리(heap) Card 클래스의 인스턴스가 생성된다.
  2. 생성자 Card() 호출되어 수행된다 
  3. 연산자 New 결과로, 생성된 Card 인스턴스의 주소가 반환되어 참조변수 c 저장된다. 


  • 객체를 생성할 필요한 내용이 있으면 생성자 안에 내용을 채워넣으면 된다 
  • 생성할 기능이 필요 없다면 공간으로 두어도 된다
  • 클래스의 접근제어자가 public 경우에는 기본 생성자로 public 클래스이름(){} 추가된다.
  • 클래스명과 메소드명이 동일하며, 리턴타입을 정의하지 않는다.
  • 사용자 정의 생성자를 생성하고, 디폴트 생성자를 정의하지 않으면  사용자정의 생성자의 파라미터에 맞게 인자를 전달해야 객체를 생성할 있다. 
  • 사용자 정의 생성자만 있다면 디폴트 생성자를 사용할 없다.
  • 만약 클래스에 생성자가 하나도 없다면 컴파일러는 자동으로 디폴트 생성자를 추가한다. 하지만 사용자가 작성한 생성자가 하나라도 구현되어 있다면 컴파일러는 디폴트 생성자를 추가하지 않는다.


연산자 New 인스턴스를 생성하는 이지 생성자가 인스턴스를 생성하는 것이 아니다. 생성자라는 용어 때문에 오해하기 쉬운데, 생성자는 단순히 인스턴수변수들의 초기화에 사용되는 조금 특별한 메서드일뿐이다. 생성자가 갖는 몇가지 특징만 제외하면 매서드와 다르지 않다


생성자는 클래스의 이름과 동일한 메소드로 볼 수 있다. (그래서 리턴값이 없다는 의미인 void를 붙여야 하지만, 모든 생성자가 리턴값이 없으므로 void를 생략할 수 있게 한 것이다.)


인프런 자바 강의 설명

 클래스는 객체를 생성할 목적으로 만든다. 생성자는 이 객체를 메모리에 올릴 때 사용된다.  

클래스로부터 객체를 만들 가장 먼저 호출되는 곳은 생성자이다. 생성자에 의해서 메모리에 객체가 올라가며, 클래스의 이름과 동일하고 반환형이 없다 



메소드

반환하는 자료형이 없으면 void 명시한다



오버로딩(overloading): 중복 메서드

이름은 같고, 매개변수의 개수 또는 타입이 다른 메서드를 만드는 것을 말한다

  • 똑같은 이름으로 선언할 있지만 파라미터의 개수, 자료형의 차이를 두어야 한다. 
  • 여러 메서드 가운데 원하는 메서드를 사용하기 위해서는 인수를 통해서 파라미터에 값을 전달하여 해당하는 메소드를 사용하면 된다. 



메소드 오버라이딩 (Method overriding)

  • 부모클래스의 기능을 자식클래스에서 재정의해서 사용한다  ( 메소드 덮어쓰기)
  • 기능을 업데이트하기 위해 사용한다  
  • 하위클래스 메소드에서는 어노테이션으로 @Override 표시한다. 그럼 재정의를 쉽게 알아볼 있다
  • 부모클래스의 메소드를 자식클래스가 동일한 형태로 또다시 구현하는 행위를 메소드 오버라이딩(Method Overriding)이라고 한다. 
  • 자식 클래스와 부모클래스에 동일한 형태(입출력이 동일) 메소드를 구현하면 자식 클래스의 메소드가 부모 클래스의 메소드보다 높은 우선순위를 갖게 되어 자식 클래스의 메소드가 호출되게 된다.



-접근자

Private:  외부, 클래스밖에서는 호출할 없다. 객체 내에서만 사용가능


Public : 메서드 호출부, 외부에서 호출 가능



Null nullPointException

래퍼런스에 null 저장되면 객체의 연결이 끊기며, 이상 객체를 이용할 없다.


Reference ref1 = new Reference();

ref1 = null;

      ref1.run()

Exception in thread "main" java.lang.NullPointerException



디폴트 생성자

객체가 생성될 가장 먼저 호출되는 생성자로, 개발자가 명시하지 않아도 컴파일 시점에 자동적으로 생성된다 

  • Obj obj1 = new Obj(); 객체를 생성하면 자동적으로 
  • Public Obj(){ } 생성된다


사용자 정의 생성자

디폴트생성자 외에 특정 목적에 의해서 개발자가 만든 생성자로, 매개변수에 차이가 있다



this 객체 자신을 가리킨다 

x = x; 라고 하면 헷갈리며, 지역변수라고 간주된다.

this.x = x; this 통해서 객체 자신을 가리킨다( 자신을 가라킴, 젼역변수를 가리킴, 전역의 속성을 가짐) 파라미터로 전달되는 인자값은 지역변수로서 메소드가 끝나면 사라지지만 this 도트 접근자 + 변수를 통해서 값을 대입하게 되면 전역변수에 값을 대입할 있게 된다. 

 객체를 여러개를 만들어서 사용하다 보면 지금 현재 내가 가리키고 있는 객체가 어떤 객체인지를 헷갈릴 있는데, 이때 명시할 유용하다

  • 자바의 정석에 나온 내용
  • this : 인스턴스 자신을 가리키는 참조변수, 인스턴스의 주소가 저장되어 있다. 모든 인스턴스매서드에 지역변수로 숨겨진채로 존재한다.
  • this(),this(매개변수) 생성자, 같은 클래스의 다른 생성자를 호출할 사용한다.




static

클래스의 속성과 메서드에 static 키워드를 사용하면 어디서나 속성과 메소드를 공유할 있다. 같은 클래스를 사용해서 객체를 생성한다고 하더라도 변수의 데이터는 공유할 없는데, static 사용하면 변수를 공유할 있다.(변수의 데이터를 공유가능)   

  • 메소드에 static 지정되어 있는 경우 메소드는 인스턴스 생성없이 실행 있음을 의미



멤버변수의 private 설정, 접근제어자(Access Modifier)

멤버변수(속성) 주로 private 설정해서, 외부로부터 데이터가 변질되는 것을 막는다

  • private 멤버변수를 설정하면 외부(다른 클래스)에서는 데이터를 찾을 없다고 나온다!!
  • 설정하지 않는다면 외부에서 간단하게 stu1.score=70;으로 변경할 있다
  • Public private 설정이 없을때 초기값 뭘까?! => 디폴트라는 설정값이 있다 
  • default 접근 제어 지시자가 없는 경우를 의미하는데, 접근 제어자가 없는 메소드는 같은 패키지에 있는 메소드에 대해서만 접근을 허용한다



getter, setter

멤버변수를 외부에서 변경할 있도록 하는 메서드이다. 

속성을 private 설정하면 초기화 작업 이후에는 외부에서 접근할 없다. 그래서 외부에서 접근할 있도록 getter, setter 메소드를 만든다. 

  • setter, getter 메소드를 쓰지 않고 바로 멤버변수를 바꾸면 되지 않느냐고 생각할 있지만 getter, setter 메서드를 사용하면 데이터를 거쳐서 받을 있게 되는데, 작업을 통해서 데이터에 조건을 걸어서 데이터를 보호하는 작업을 있기 때문이다. , 안전장치를 만들 있기 때문이다. 
  • 초기값을 변경할 없게 하려면 setter 메소드를 만들지 않으면 된다.


상속 - extends

부모클래스를 상속받은 자식클래스는 부모클래스의 속성과 기능도 이용할 있다.  내가 만들지 않아도 있다 상속을 받는 이유는 기존의 검증된 class 이용해서 빠르고 쉽게 새로운 class 만들 있기 때문이다.

  • 상속관계 ‘~ ~이다.(is-a)’ , 포함관계 ‘~ ~ 가지고 있다(has-a)’
  • 상속을 받고, 클래스를 생성하면, 부모 클래스가 먼저 생성되고 다음 자식클래스가 생성된다. 상위클래스가 메모리에 객체 만들어주어야 하위클래스가 부모 클래스를 상속받으므로 어찌보면 당연한 순서이다. 
  • 자바는 다중상속을 지원하지 않는다. 자바는 단일 상속, 클래스는 하나의 클래스만  상속을 받을 있다고 정의한다
  • private 접근자는 자식클래스에서 사용할 없다. 상속에서 제외됨!!
  • 프로그래밍에서는 다이어그램을 사용하는데 상속을 나타낼 때는 화살표가 있는 실선을 사용한다. 하위클래스에서 상위클래스 쪽으로 화살표가 있는 실선을 통해 나타낸다 





자료형

  • 기본 자료형처럼 클래스도 자료형이다.
  • 같은 클래스를 상속받으면 다른 객체라고 할지라도 상속받은 클래스를 자료형으로 사용할 있다. 이를 통해 배열을 만들 있다.    ParentClass[] pArr = new ParentClass[2]; 
  • 같은 데이터 타입은 배열을 만들 있다. 


Object 클래스

모든 클래스의 최상위 클래스는 Object 클래스이다. 

  • 모든 클래스를 데이터 타입 Object 통일시킬 있다


Super 클래스

  • 상위 클래스를 호출할 super 키워드를 사용한다
  • this 같은 클래스 내의 객체를 가리킨다면, super 상속받은 클래스의 객체를 가리킨다
  • super.name 같이 사용할 있다. 
  • super 상속받은 클래스인지 아니면 무한 위인지 확인해보자 



내부클래스(innerClass), 익명클래스(AnonymousClass)

  • 내부클래스는 클래스 안에 다른 클래스가 있는 것을 말한다. 이렇게 하면 클래스의 데이터에 쉽게 접근할 있는 장점이 있으나 가독성이 떨어지고 복잡해질 있다.
  • 내부 클래스 접근법

OuterClass oc = new OuterClass();

OuterClass.InnerClass ic = oc.new InnerClass();


  • 객체지향은 클래스 단위로 객체를 생성해, 객체간의 관계를 이용해서 프로그래밍을 해나가는데, innerClass 로직이 복잡해질 우려가 있으므로 실무에서는 많이 쓰이지 않는다
  • 익명클래스는 이름이 없는 클래스로 주로 메서드를 재정의하는 목적으로 사용한다. 객체 데이터 타입과 참조변수를 정의하지 않고 사용한다. 
  • ) new AnonymousClass(){   }.method();
  • 익명클래스는 인터페이스나 추상클래스에서 주로 이용된다



클래스에서 new 키워드를 이용해서 객체를 생성하고 


Class 부터 new 키워드를 이용해서 객체를 메모리에 생성하고, 메모리에 생성된 객체를 reference(참조변수) 이용해서 접근해서 속성과 기능을 이용할 있다.

배열이란 자료형의 종류가 아닌 자료형의 집합 의미한다.




인터페이스(Interface), 다형성, 폴리모피즘(Polymorphism)

  • 객체가 다양한 데이터 타입(자료형) 가질 있도록 해준다 
  • 인터페이스는 메소드를 선언만 하지 본문을 정의하지 않으며, 인터페이스를 implements 클래스에서 메소드의 본문을 작성한다. 이러한 특성으로 인해 인터페이스를 작업명세서라고 불린다.(껍데기만 가짐)

InterfacaA ia = new ImplementClass();

InterfacaB ib = new ImplementClass();

InterfacaC ic = new ImplementClass();

ImplementClass id = new ImplementClass();

  • Implements 하고 있다면 예시처럼 다양한 데이터 타입을 가질 있다. Ps. 데이터 타입에 의해서 사용할 있는 메소드와 그렇지 않은 메소드가 구분된다. 
  • 이렇게 하나의 객체가 여러개의 자료형 타입을 가질 있는 것을 객체지향 세계에서는 다형성, 폴리모피즘(Polymorphism)이라고 부른다.
  • 인터페이스에 선언만 해주고 클래스에서 구현하기 때문에 인터페이스가 제공하는 메소드에 따라서 객체를 객체의 성격에 맞게 작성할 있는 장점이 있다.  


Interface 인터페이스

인터페이스는 의존적인 클래스를 독립적인 클래스로 만들어준다

  • 인터페이스의 메소드는 메소드의 이름과 입출력에 대한 정의만 있고 내용은 없다., 본문이 없다!!
  • 본문 인터페이스를 implements 클래스들이 구현해야만 한다
  • 이는 인터페이스를 사용하기 위한 규칙이다. 인터페이스에서 설정한 getFood() 라는 메소드는 인터페이스를 implements 클래스들이 본문을 구현해야한다.
  • 메소드의 파라미터로 객체를 전달받으면 해당 객체의 메소드(오버로딩 , 이름은 같고 사용자정의 데이터 타입이 다른) 호출된다 



추상클래스(Abstract Class)

  • 멤버변수를 가진다
  • abstract 클래스를 상속하기 위해서는 extends 사용
  • abstract 메서드를 가지며, 상속한 클래스에서 반드시 구현해야 한다
  • 일반메서드도 가질 있다. 
  • 일반클래스와 마찬가지로 생성자가 있다.
  • 단일 상속만 지원한다

 


람다식(Lamda)

  • 익명함수(Anonymous Function) 이용해서 익명객체를 생성하기 위한 식이다. 

Lamda2 ld2 = (x, y) -> {

int result = x + y; 

return result;

};

System.out.println(ld2.method(10, 20));



Collections(자료형) List, Map

프로그래밍은 데이터를 주거니 받거니 하는 , 받는 쪽에서 데이터를 처리하고 보낸 쪽에 돌려주는 과정 등을 거친다.

데이터를 하나하니씩 주고 받는 경우도 있겠지만 복잡한 데이터를 이용할 경우에는 여러가지 클래스를 사용해서 데이터를 처리할 있다.

데이터베이스에 있는 자료를 꺼내와서 자바에서 활용한다고 했을 자료형 객체를 활용하게 된다.


List

ArrayList<String> list = new ArrayList<String>

  1. ArrayList 객체 타입을 만들고!(자료형 타입)
  2. ArrayList 관리할(입력 받는) 데이터가 어떤 데이터 타입인지를 명시한다. 예를 들면, <String> 적어준다
  3. ArrayList<String> 클래스이므로 연산자 new 통해서 객체를 메모리에 생성한다.(new는 클래스의 생성자를 호출하며, 생성자는 호출될 객체가 메모리에 올라간다.)


생성자는 인스턴스 변수들을 초기화하는 메서드와 다를바가 없는데..! 


Map

key 이용한다. key 중복될 없지만 데이터는 중복이 가능하다.

HashMap 키를 만들어야 하고, 키와 매칭되는 데이터도 만들어야 한다.

HashMap<Integer, String> map = new HashMap<Integer, String>

  • HashMap 이라는 클래스에 이어서 데이터가 2개가 들어옴
  • <Integer, String> 앞이 키값, 뒤는 데이터 
  • 참조변수를 만들고, 연산자 new 통해서 객체를 메모리에 생성한다.(new는 클래스의 생성자를 호출하며, 생성자는 호출될 객체가 메모리에 올라간다)


예외

사소한 오류 때문에 프로그램이 동작을 멈출 수 있으므로 이를 예방하기 위해서 예외처리를 한다.(전체적인 시스템 흐름에 방해가 되지 않게 하기 위해서)

외처리하기 가장 쉽고, 많이 사용되는 방법으로 try ~ catch 구문이 있다. 


Exception 의 대표적인 메소드로 e.printStackTrace(); (어떠한 예외가 발생했는지 콘솔창에 출력해줌) 와 e.getMessage(); (예외를 간략하게 나타낸 문자열을 받는 것) 가 있다. 

 

  • 예외가 발생하면 예외가 발생한 구문 이후로 넘어가서 실행이 이루어지게 된다. (try 안에서도 예외가 발생하면 캐치문이 실행된다)
  • Try~ catch 안에서 예외가 발생한 이후의 구문은 실행이 안된다.
  • 예외의 발생여부와 관계없이 반드시 실행해야 하는 구문은 finally 넣는다. 
  • 예외가 발생할만한 코드는 보험을 들어놓기 위해 try안쪽에 작성하고
  • Catch 발생할 있는 예외를 잡는 용도로 사용한다
  • throws 예외가 발생하면 예외를 처리하지 않고 호출한 곳으로 넘긴다. 

 




1. 그자원이 글쓴이 분께서 생각하는 자원(메모리에 할당된 인스턴스) 아니라 운영체제의 자원(시스템 자원)입니다.

파일로 예를들면 파일 출력을 위해서 하드디스크에 저장되 있는 파일에 내용을 메모리로 가져와야 하는데 파일의 내용을 모두 메모리에 올리는것이 부담인 경우가 많습니다. 그래서 많은 프로그래밍 언어들이 파일에 대해서 입출력 스트림을 연결합니다.  File인스턴스를 생성하는 순간 파일의 모든 내용이 메모리에 올라오는 것이 아니라 스트림을 연결하여 언제든지 원하는 부분의 원하는 만큼 내용을 읽어 들일수 있도록 하는 거죠 그때 연결한 Stream 자원이라 하고 이것은 시스템에서 제공해주는겁니다.(운영체제가 제공을 해준다는 거에요이런식으로 시스템 자원들은 대게 DB커넥션, 네트워크 커넥션, 쓰레드 있구요


2. 보통 Close 있는 클래스들은 이런식의 시스템자원을 끌어다 쓰는경우가 많기 떄문에 하는게 좋습니다. 시스템 자원이 아니더라도 API 만든 사람이 Close 메소드를 호출하기를 원할수 있구요 그러니항상 API문서를 확인하는 습관을 들여야겠죠


3. 예외가 발생한 경우 예외가 발생한 지점 이후의 코드는 실행되지 않습니다. (try 블럭내에서 코드 만요

예외가 발생하면 코드를 건너뛰고 catch블럭으로 이동하기 때문이죠 그렇게 되면 close메소드 호출을 try 블럭에 마지막에 했다면 close메소드는 호출 되지 않고 자원은 반납 되지 않겠죠

finally블럭은 예외가 발생하던 하지 않던 무조건 호출 되는 블럭 입니다

또한 자원을 반납하는 close 메소드의 경우도 예외가 발생할수 있기 때문에 close에서도 예외처리를 하는게 관행이구요 여기서 착각하지 말아야하는게 close메소드의 예외처리를 하는것이 자원반납이 됨을 보장해주려는 것이 아니라 자원 반납을 하지 못했다는것을 알리기 위한 용도입니다


추가로 이러한 자원의 반납의 코드는 거의 같은 형태를 띄며 개발자가 작성하는 것은 굉장히 지루한 일입니다. 그래서 자바7에서 이러한 코드를 더욱더 간결하게 하는 문법을 제공하고 있구요

try with resources 라고 불리며 아래의 코드는 위의 작성하신 코드와 동일한 동작을 보장합니다.


try(FileInputStream fis = new FileInputStream()) {

.....

} catch(Exception e) {

.....

}