개발 공부/JAVA

즐거운 자바 필기

공부하는개발자_ 2023. 5. 4. 19:55

Book            b  =    new   Book  ( );
레퍼런스타입       참조변수

-Int, long, short, byte : 값을 참조하는 것이 아니고,값을 메모리 크기만큼 가질 수 있는 기본형 type
-
참조형type은 객체를 참조함.

 

클래스

클래스는 필드와 메소드를 가진다.

필드는 클래스의 속성이라고 말할 수 있다.

메소드는 클래스의 기능이라고 말할 수 있다.

 

 

클래스 선언 방법

public           class      클래스이름 { }
protected
(X)
private

 

-class 앞에는 접근 제한자가 붙는다.

-클래스 이름을 어떻게 지어야 하는가?
문자, _ , $,한글로 시작될 수 있으나 숫자는 불가능.
대문자로 시작해야함. 단어와 단어가 만날 때 단어시작을 대문자로.

  Ex) HelloWorld

 

메소드 : 기능, 행위 (동전 넣기, 잔액 보여주기)

인스턴스 : 객체 (자판기, 동전, 상품, 버튼..)

프로그램 설계 : 내가 만들어야 할 객체, 클래스 이름을 정하는 것
클래스와 객체 간의 관계를 표현하는 것.

 

 

public class vendingmachine {

field (자판기가 가지는 것들)

}

클래스메소드 : static이 붙은 메소드
-
인스턴스를 만들지 않아도 메모리에 올라가 있기 때문에 사용할 수 있다

 

할아버지   ----->    지팡이
걷다

 

할아버지는 지팡이에 의존한다

메소드에서 사용하는건 의존한다



main메소드에서 VendingMachine을 사용하는데, VendingMachine클래스가없다면 컴파일 오류가 발생. VendingMachineMain VendingMachine이 있어야만 main메소드가 실행 될 수 있다. 그렇기 때문에 의존한다고 표현.

 

클래스명   변수명   = new   클래스명 ( ) ;

참조타입     참조변수   new연산자     생성자

 

 

인스턴스를 만드는 3가지 방법

1.     New 연산자와 생성자를 이용하여 인스턴스를 만드는 방법

2.     클래스 로더를 이용

3.     메모리에 있는 인스턴스를 복제하여 만드는 방법

  

 

메소드 선언

[접근제한자]  [static]   리턴type  메소드이름 ([매개변수,…]) {

실행문

}

 Public         static        void         main (Stirng[ ] args)  

 

- 메소드 이름은 소문자로 시작

- 매개변수 (parameter): 메소드의 정의 부분에 나열되어 있는 변수를 의미.
-
전달인자 (argument) : 메소드를 호출할 때 전달되는 실제 값 의미


매개변수 : 메소드에 전달하는 값

반환 값: 메소드가 외부로 반환하는 값

 

 

 

 

 

 

 

 

 

Static한 메소드(=클래스메소드) 는 인스턴스를 생성하지 않아도 호출할 수 있다.

클래스명.메소드명( );

Ex) VendingMachine.printVersion ( );

 

레퍼런스 변수를 이용해서 static메소드를 사용할 수 있는가? 가능은 하나 바람직 하지X.

 

  

JVM이 클래스를 실행하려면 어디서 찾아야 할까?

classpath경로에서 "찾고자하는"class를 찾아 실행한다.

CLASSPATH. < 점이 있는 경우 현재 경로에서 클래스를 찾을 수 있게 됨.

->Perm이라는 메모리 영역에 클래스 정보를 저장함.
-> main
메소드가 실행되면 stack에 메소드 정보가 올라 감

(메모리- heap : instance/ perm: class / stack: method )

메소드가 실행되면 stack entry가 추가됨

 

 

*메소드 안에 선언된 지역변수는 , 메소드가 실행될 때 생성되었다가 메소드가 종료될 때 사라진다. 동시에 메소드가 호출되도 문제가 없다.
그러나 메소드에서 클래스 안에 선언된 변수를 사용할 경우엔 문제가 발생 할 수 있다.

 

Math클래스는 모든 메소드에 static이 붙어있음 -> instance를 만들 필요가 없음 (메모리 낭비)

기본 생성자는 생성자가 없을 경우 컴파일 할 때 자동으로 생성된다.

Public  MyMath( ) { } => 인스턴스 생성을 못 하게 할 경우 public private으로 바꿔주면 됨.

 

*필드
클래스는 필드, 메소드를 가질 수 있다.
필드는 클래스가 가지는 속성이다. 클래스가 가지고 있는 정보를 필드라 한다.
클래스필드, 인스턴스필드 (static이 붙지 않은)
필드는 어떤 키워드와 사용하느냐에 따라 사용방법이 달라진다

*필드 선언방법
[
접근제한자] [static] [final] 타입 필드명 [=초기값];
필드명 첫번째 글자는 소문자로 시작.
문자열은 new를 사용하지 않고 인스턴스를 시작할 수 있다. 되도록 new를 사용하지 말라. (String 사용할땐)

Ex) String name; (=이 없는 것은 참조하는게 없으니 null값이 나옴)
String address = “
경기도 고양시”; public int age = 50; protected Boolean flag;

static한 필드는 클래스명.필드명 형식으로 사용한다.
-static 필드를 클래스 변수라고도 한다.

 

인스턴스 필드와 인스턴스 메소드는 인스턴스를 생성한 후, 그 인스턴스를 참조하는 참조 변수를 이용해서 사용해야 한다.
static
한 메소드는 인스턴스 필드나 인스턴스 메소드를 사용할 수 없다.
(
이유는 메모리에 생성되는 시점이 다르기 때문에)

클래스 필드는 static블록에서 초기화 할 수 있다.

 

상속 선언 방법

[접근 제한자] [abstractl final] class 클래스명 extends 부모클래스명 {

……..

}      ex) class TV extends 전자제품
아무것도 상속받지 않으면 자동으로 java.lang.Object를 상속 받는다.
 -
모든 클래스는 Object의 자손이다.


부모 타입으로 자손 타입을 참조할 수 있다.
 -
버스는 자동차다.
Car car = new Bus ( ) ;

다형성 메소드 오버라이딩

Over + ride = 올라타다
부모 클래스가 가지고 있는 메소드를 자식 클래스에서 재정의 하는 것.
메소드가 오버라이딩 되면 무조건 자식의(오버라이딩된) 메소드가 실행된다

필드는 Type을 따라가고, 메소드는 오버라이딩된 자식의 메소드가 실행된다.

 

Getter, Setter 메소드 (=property)

private
필드는 직접 접근 불가.
그럼 어떻게 접근하는가? 필드의 값을 수정하거나 얻기위한 메소드를 만든다
=> setter, getter

this.price;
여기서 this는 내 자신 인스턴스를 참조하는 예약어.
메소드가 길어지면 메소드에서 선언된 지역 변수인지 필드인지 헷갈리기 때문에 this.를 붙여서 구분

 

Object가 오버라이딩하라고 제공하는 메소드

인터페이스

(
추상클래스와 마찬가지로) 메소드가 선언만 되어있기 때문에 new 연산자로 인스턴스 생성 불가
참조할수있는 reference는 될 수 있다.
추상 메소드를 가질 수 있다.

팩토리 메소드 패턴
복잡한 생산 과정을 숨기고, 완성된 인스턴스만 반환한다.

클래스 로더를 이용한 인스턴스 생성하기
Class clazz = Class.forName(“클래스풀네임”);
Object obj = clazz.newInstance( );

이름없는 클래스 (Anonymous Class)
new
생성자( ) {…}
생성자 뒤에 중괄호가 나오고 코드를 오버라이딩 하여 보통 구현한다.
Car car = new Car( ) {
    public void run ( ) {
       system.out.println(“Car
를 상속받는 이름없는 객체가 run메소드를 오버라이딩함”);

람다 인터페이스 메소드를 하나만 가지고 있는 인터페이스
람다 인터페이스는 메소드를 한 개 가지고있다.

 

 

배열이란?
참조타입. 같은 타입의 변수가 여러 개 필요할 때 사용한다.

기본형 배열
배열은 기본형 배열과 참조형 배열로 나뉜다.
기본형 배열이란 기본형 타입을 사용하는 배열을 말한다. boolean, byte, short, int, ..

기본형타입[ ] 변수명;
기본형타입   변수명[ ];

int [ ] array1, array2;    array1,2모두 배열
int array3 [ ], array4;    array3
만 배열


배열의 형태 예시
int [ ] array1 = new int [ 5 ] ;
array1[0] = 1;
array1[1] = 2;
array1[2] = 3;
array1[3] = 4;
array1[4] = 5;

int[ ] array2 = new int[ ]{ 1,2,3,4,5 } ;
int[ ] array3 = { 1,2,3,4,5 };

=> array 1, 2, 3
모두 같은 값. Array2 new int[ ]는 생략가능.

참조형 배열
배열이 가지는 값이 참조형 이라는 뜻.
배열 변수가 참조하는 배열의 공간이 값을 참조한다는 것을 의미.

ItemForArray[ ] array1;
array1 = new ItemForArray[5];

- 아무것도 참조하는 것이 없으므로 값이 null이 나옴
- new가 나왔다고해서 instance로 착각하면 안됨.  new ItemForArray[5]는 배열만 만들어 진 것.

 

 

배열의 길이 구하기
배열은 length필드를 가진다.

이차원 배열
타입 [ ] [ ] 변수명 = new 타입 [행의수] [열의수];
변수명[행인덱스][열인덱스] = ;

 

for each
for (타입 변수명 : 배열명 {

}

Array : java.util이라는 package에 포함되어 있기 때문에 import문장을 사용해서 쓰거나, java.util.Arrays로 사용해야한다. 
-깊은 복사와 얕은 복사의 차이점을 공부해 보라하심.

 

java.util.Arrays.copyOfRange 
copyforRange : 범위를 지정해서 복사할 수 있는 메소드. 배열 중에 일부분만 복사해서 배열을 만들어 낼 수 있다. 

Error
의 종류
Error :
수습할 수 없는 심각한 오류
Exception
비정상적으로 프로그램을 종료되게 하는 원인. 예외 처리를 통해 수습할 수 있는 덜 심각한 오류

 

ObjectBox는 어떤 Object든 저장할 수 있고, 어떤 Object도 꺼낼 수 있다.
꺼내서 사용할 때는 원래 타입으로 변환시키는 번거로운 과정이 필요하다

GenericBox
제네릭은 클래스 이름 뒤나,메소드의 리턴타입 에도 붙을 수 있다.
형 변환 할 필요가 없다.

 

 

 

 

 

Collection Framework

 

java.util.Collection 인터페이스
자료가 있다. 자료를 추가할 수 있어야 하니 add 메소드가 있다. Size는 물건이 몇 개 있는지 알 수 있는 메소드.
컬렉션 프레임워크에서 가장 기본이 되는 인터페이스
순서를 기억하지 않고, 중복을 허용하여 자료를 다루는 목적으로 만들어짐.

java.util.List
인터페이스
순서가 중요한 자료를 다룰 때 사용하는 인터페이스
Collection
을 상속받음으로써 Collection이 가지고 있는 add( ), size( ), iterator( )메소드를 사용할 수 있다.
특정 순서로 저장된 자료를 꺼낼 수 있는 get 메소드를 가지고 있다
물건, 객체를 담기 위한 인터페이스. 순서를 기억하기 위한 자료구조. Data를 저장할 수 있는 객체.


java.util.Set
인터페이스
중복을 허용하지 않는 자료구조. 같은 값이 들어오면 무조건 1건만 저장을 함.
set
인터페이스에 저장되는 객체들은 Object가 가지고 있는 equals( )메소드와 hashCode( )메소드를 오버라이딩 해야한다.

java.util.Iterator

기능을 표현. 꺼낼게 있으면 true, 없으면 false. Next는 하나 꺼내라는 메소드.

java.util.Map
key
value로 구성되어 있는 자료구조.  Key들만 모아놓으면 Set이 됨.



듣기 전에는 일주일 안에 전체 강의를 듣는게 목표였으나, 이해 안갈때마다 돌려서 다시 듣고, 객체지향 쪽부터는 2번씩 듣다보니 생각보다 시간이 많이 지연되었다. 아직 듣지 못한 강의가 남아있는데 얼른 다 듣고 미니프로젝트 해보고싶다><!