Java

Minji·2022년 7월 31일
0

Type

데이터의 종류

  • 기본형(primitive type)
    미리 정해진 크기의 Memory size로 표현, 변수 자체에 값을 저장
  • 참조형(reference type)
    크기가 미리 정해질 수 없는 데이터의 표현, 변수에는 실제 값을 참조할 수 있는 주소만 저장

Primitive type

논리형(boolean), 문자형, 숫자형
byte 8bit
short 16bit
int 32bit -> overflow 주의
long 64bit
float 32bit
double 64bit
-> 실수 연산은 부정확함(유효 자리수를 이용한 반올림 처리)
float var1 = 10.0 //Type mismatch: cannot convert from double to float 오류남
float var1 = 10.0f 또는 double var1=10.0으로 작성해야함
char 16 bit
-> 기억할 ASCII 코드 ('0' = 48, 'A' = 65, 'a' = 97)

Type casting(형변환)

  • 변수의 type을 다른 type 으로 변환하는 것
  • primitive <-> primitive
  • reference <-> reference 가능
  • boolean은 호환되지 않는다
  • 기본 타입과 참조형의 형 변환을 위해서 Wrapper 클래스를 사용함

묵시적 형 변환(promotion) vs 명시적 형 변환

묵시적 형 변환은 타입의 크기가 아니라 표현 범위가 커지는 방향으로 할당할 경우에 발생하며, 자료의 손실이 없기 때문에 JVM이 알아서 해주는 반면, 명시적 형 변환은 값 손실이 발생할 수 있기 때문에 형 변환한다고 ()를 이용해서 작성해줘야한다.

연산자

최후위연산자 : 대입연산자
최전위연산자: 괄호
변수의 초기값은 일반적으로 부정적인 의미로 두는 게 좋다.

논리연산자 || 을 사용할 때, 앞이 True이면 뒤에는 실행하지 않기 때문에 앞이 True인게 좋다.
&&을 사용할 때는 앞이 False인게 좋다.

piblic static void main(String[] args){
	a=10;
    b=20;
    System.out.println((a+=10) > 15 || (b-=10) > 15); // true
    System.out.println("a = " + a+", b = " + b); // a=20, b=20

}

배열

type이 동일한 데이터를 하나의 연속된 메모리 공간에서 관리하는 것

  • 배열 요소의 초기화 : int,byte,short의 기본값 0, boolean기본값 false, 참조형 변수 : null
  • 주의사항
    {}을 통한 배열 생성은 변수 선언과 동시에 진행해야함
boolean [] bools;
bools={true,false,false};
//------------위처럼 하면 오류남
boolean[] bools= new boolean[]{true,false,false}; // 맞는 표현
  • 배열 생성과 메모리 사용
    배열 선언 -> 배열 생성 -> 참조 값 할당 -> 요소에 값 할당
  • for - each문
    for(int x: intArray){};
    Array is immutable
    배열은 최초 메모리 할당 이후에 변경할 수 없다.
    개별 요소는 다른 값으로 변경은 가능하지만, 요소를 추가하거나 삭제할 수는 없다.

객체지향 프로그래밍

OOP(Object Oriented Programming)
객체? 주체가 아닌 것, 주체가 활용하는 것
객체지향 프로그래밍? 주변의 많은 것들을 객체화해서 프로그래밍 하는 것
장점 : 신뢰성 높은 프로그래밍 가능, 추가,수정,삭제가 용이함, 재사용성이 높음

class와 객체

프로그래밍 -추상화-> 클래스 -구체화-> 객체
현실의 객체가 갖는 속성과 기능이 추상화(abstraction)되어서 클래스에 정의됨
클래스는 구체화가 되어서 프로그램의 객체(instance,object)가 됨

  • 객체를 정의해 놓은 객체의 설계도, 틀
  • 객체는 클래스를 데이터 타입으로 메모리에 생성한 것

class의 접근제어자

  • private 불가능
    class는 객체를 만들기 위해서 쓰는 것인데 private은 쓸모 없게 되기 때문에 사용하지 않습니다.
  • protected 불가능
    상속관계에서 써야하기 때문에 불가능합니다.
  • static 불가능
    static은 메서드,변수에만 붙을 수 있다.

JVM의 메모리 구조

Class Area, Method Stack, Heap으로 이뤄져 있다.

class Area

클래스 원형 로딩하는 곳(Field 정보, Method정보, 타입 정보, 상수 풀)

method stack

메서드들의 실행 공간
thread별로 별도로 관리한다.
메서드 호출 순서대로 이 스택에 쌓인다.
메서드 프레임에 로컬 변수도 쌓임
로컬변수는 선언된 영역을 벗어나면 삭제된다.

Heap

객체를 저장하기 위한 영역
thread에 의해서 공유된다.
생성된 객체는 프로그래머가 삭제할 수 없고 GC(Grabage Collector)만이 제어할 수 있다.

선언위치에 따른 변수의 종류

  • 멤버 변수(클래스 멤버 변수, 인스턴스 멤버 변수)
    선언위치: 클래스 멤버 변수, 인스턴스 멤버 변수는 클래스 영역
  • 지역변수(지역 변수, 파라미터 변수)
    선언위치: 지역변수는 함수 내부, 파라미터 변수는 함수 선언부

생성,소멸 시점

인스턴스 멤버 변수
객체가 만들어질 때 객체 별로 생성되고 생성되는 메모리 영역은 heap이다.
소멸 시점은 GC에 의해 객체가 없어질 때이며 명시적으로 소멸시킬 수 없다.
클래스 멤버 변수
static키워드를 붙여서 선언한다.
클래스 영역에 클래스 로딩 시에 메모리 등록함
소멸 시점은 프로그램 종료할 때이다.
지역변수 & 파라미터 변수
선언된 라인이 실행될 때 thread별로 생성된 stack에 생성된다.
소멸 시점은 선언된 영역이 {}을 벗어날 때 이다.

method

메서드 : 기능처리
메서드 접근 : 메모리에 호출하려는 멤버가 있으면 호출 가능, 없으면 먼저 메모리에 로딩 후 사용
static member는 클래스 로딩 시에 자동으로 등록되기 때문에 언제나 메모리에 있다.
instance member는 객체 생성 전에는 메모리에 없다.

  • 메서드 호출 시 파라미터로 입력된 값을 복사해서 전달

오버로딩 vs 오버라이딩

오버로딩은 동일한 기능을 수행하는 메서드의 추가 작성
println, printf등도 오버로딩의 일종이다.
메서드 이름은 동일하고 인자값의 갯수나 인자값의 type등이 달라야 오버로딩이다.(return type은 상관없다.)
오버로딩의 장점은 중복 코드에 대한 효율적인 관리가 가능하다.

오버라이딩은 부모클래스에서 정의된 메서드를 자식 클래스에서 적합하게 수정하는 것
조건

  • 메서드의 이름이 동일해야한다
  • 매개 변수의 개수, 타입, 순서가 같아야한다.
  • 리턴 타입이 동일해야한다
  • 접근 제한자는 부모 보다 범위가 넓거나 같아야한다.
  • 조상보다 더 큰 예외를 던질 수 없다

생성자

this

참조 변수, 객체 자신을 가리킨다. (객체 참조)
로컬 변수와 멤버 변수의 이름이 동일할 경우 this를 사용해서 멤버 변수임을 명시적으로 나타낼 수 있다.

this()

메서드와 마찬가지로 생성자도 오버로딩 가능함.
맨 첫줄에서만 호출 가능함
객체 생성 시 필요한 멤버 변수만 초기화 진행 -> 생성자 별 코드의 중복 발생
한 생성자에서 다른 생성자를 호출할 때 사용

super

조상 클래스 멤버에 접근

super()

조상 클래스의 생성자 호출
맨 첫줄에서만 호출 가능하다.
this() or super()를 호출하지 않으면, 컴파일러가 super()를 삽입해준다.

객체 지향 언어의 특징

추상화 , 다형성, 상속, 데이터 은닉과 보호
추상화: 현실의 객체를 추상화 해서 클래스를 구성함
다형성: 하나의 객체를 여러가지 타입으로 참조할 수 있다.
상속: 부모 클래스의 자산을 물려받아 자식을 정의함으로 코드의 재사용이 가능하다
Encapsulation: 데이터를 외부에 노출 시키지 않고 메서드를 이용해서 보호할 수 있다.

상속

모든 클래스는 Object class를 상속 받는다.
상속의 관계는 is a관계라고 한다.
자바는 단일 상속만 가능하며, interface의 포함관계(has a관계)로 다중 상속할 수 없다는 단점을 극복할 수 있다.

Annotation

JVM,컴파일러,프레임워크 등이 보는 주석

== vs equals()

객체의 주소 비교 : ==
객체의 내용 비교 : equals 재정의

hashCode

시스템에서 객체를 구별하기 위해서 사용되는 정수 값으로, 객체의 해시 코드를 사용한다.

package, import

package

패키지 : 의미 있는 이름으로 만들고 .을 통해서 계층적 접근 모든 클래스는 반드시 하나의 패키지에 속함 default package가 만들어지기는 하지만 안쓰는게 좋음 package 일반적인 naming룰 소속.프로젝트.용도 도메인이 쓰이면 거꾸로 쓰면됨 ex) com.ssafy.hrm.common -> hrm프로젝트, 용도는 일반적이다,

import

다른 패키지에 선언된 클래스를 사용하기 위해서 필요한 키워드 패키지와 클래스 선언 사이에 위치 패키지와 달리 여러 번 선언 가능 default import package는 java.lang.*

접근 제한자, Encapsulation

제한자 : public, protected, default(=package), private
그 외: final, abstract, static, synchronized

final 마지막, 더 이상 바뀔 수 없음 용도 final class - 더 이상 확장 할 수 없다. 상속 금지-> 오버라이드 방지 final method -> 더 이상 재 정의 할 수 없음 오버라이딩 금지 final variable 더 이상 값을 바꿀 수 없다. 상수

protected : 상속 받은 클래스, 같은 패키지에서만 접근 가능(다른 패키지의 자손 클래스도 ok)
default: 자신 클래스 내부와 같은 패키지내에서만 접근 가능
private : 외부에서 접근 불가능, 같은 클래스 내에서만 접근 가능

Singleton pattern

외부에서 생성자에 접근 금지 -> 생성자의 접근 제한자를 private으로 설정 내부에서는 private에 접근 가능하므로 직접 객체 생성 -> 멤버 변수이므로 private설정 외부에서 private member에 접근 가능한 getter생성 -> setter 불필요 객체 없이 외부에서 접근할 수 있도록 getter와 변수에 static추가

외부에서는 언제나 getter를 통해서 객체를 참조하므로 하나의 객체 재사용

다형성

  • 많은 type을 가질 수 있는 성질
  • 정의: 상속 관계에 있을 때 조상 클래스의 타입으로 자식 클래스 객체를 레퍼런스 할 수 있다.
public class B extedns A {}
  A a = new A();
  B b = new B();
  A a = new B();
  //B b= new A();는 불가, 하위 클래스를 만드는데 상위 클래스 참조 불가
profile
매일매일 성장하기 : )

0개의 댓글