본문 바로가기

전체 글

(120)
java.base 모듈 java.base는 모든 모듈이 의존하는 기본 모듈로 모듈 중 유일하게 requires하지 않아도 사용할 수 있다. Object 클래스 모든 클래스가 암시적으로 상속받는 최상위 클래스이다. object클래스가 가지고 있는 함수는 equals()와 hashCode(), toString()가 있는데 이를 오버라이딩해서 사용한다. --equals() public boolean equals(Object obj){ if(obj instanceof Member target){ if(id.equals(target.id)){ return true; } } return false; } --hashCode() public int hashCode(){ int hashCode = no + name.hashCode(); ret..
중첩클래스 이어서 라이브러리추가 파일 찾으러 폴더 열기 add external jar 중첩클래스의 바깥클래스 접근 인스턴스 멤버 클래스 - 바깥 클래스의 모든 필드와 메소드 정적 멤버 클래스 - 바깥 클래스의 정적 필드와 정적 메소드 바깥클래스의 객체를 얻으려면 바깥클래스이름.this 이렇게 써야한다. 중첩 인터페이스 UI프로그램에서 이벤트를 처리할 목적으로 많이 활용된다. static - Button객체 없이 ClickListener인터페이스를 사용가능 하다. public class Button{ public static interface ClickListener { void onClick(); } } 익명객체 이름이 없는 객체 익명 자식 객체 - 클래스를 상속해서 만듦 new 부모생성자(매개값,...){ } 익명 구현..
인터페이스 이어서 인터페이스 타입변환 인터페이스를 타입 변환할때 운좋으면 내가 원하는대로 자식객체로 캐스팅 되겠지만 운나쁘면 에러난다. 자식객체가 일치 하지 않는데 변경해야 할 수 있기 때문이다. 그래서 instanceof를 통해 확인해주어야 한다. 인터페이스 참조 변수를 통해 인터페이스에 추상클래스로 정의 되어있는 애들만 불러올 수있다. if( a instanceof C c){//인터페이스 a참조변수가 가리키고 있는 객체가 C클래스라면 바꿔주시오 } 인터페이스 다형성 인터페이스에 어떤 구현 객체가 담겼냐에 따라서 메소드 호출결과가 달라진다. --> 추상클래스랑 비슷 봉인된 인터페이스 무분별한 자식인터페이스 생성을 방지하기 위해 봉인된 인터페이스를 사용한다. sealed 인터페이스를 직접 상속 받는 인터페이스는 non-s..
상속 이어서 JVM 메모리 영역 - 추상메소드와 오버라이딩 부분 추상메소드를 통해 메모리를 절약하고, 오버라이딩으로 자식클래스에 선언된 메소드를 부모 참조변수를 통해 참조하는 과정 추상메소드가 메모리를 절약하는이유는 {}안의 내용이 메소드 영역에 올라가지 않고 단지 null을 가지기 때문이다. object클래스의 vfptr이라는 테이블에서 메소드와 주소를 연관지어 저장하고 있는데 컴파일러가 자식클래스를 스캔했을때 동일한 메소드가 있다면 그 메소드를 가리키는 주소값으로 변경해서 테이블에 저장한다. 만약 추상클래스가 부모클래스에 선언되어있다면 메소드 영역에서는 최소한의 공간을 차지하면서 테이블에만 연관된 주소를 저장하기 때문에 메모리를 절약할 수 있다. instanceof 부모변수를 통해서 자식을 참조하고 있을때 자식객..
은행계좌(생성,삭제,입금,출금,종료) 생코딩으로 적은 후 리팩토링을 거친 결과이다. run()함수를 만들면 main()함수에서 new BankApplication().run();만 써줘도 실행 가능하다. 계좌삭제시 여기서는 계좌의 순서번호가 상관 없으니까 로또 당첨 코드처럼 배열의 맨뒤의 객체를 삭제시킨 자리에 대입해주면 더 빨리 수행할 수 있다. 이코드랑 상관없지만 교수님이 시킨거 ● 자료구조 ● 배열 - list ● map(set) ● Tree import java.util.Scanner; class Account { private String number; //계좌번호 private String name; //이름 private int balance; //잔액 public Account(String number, String name,..
상속 상속 부모 클래스를 자식클래스가 상속받을 때는 extends를 사용한다. public class 자식클래스 extends 부모클래스{ } 자식클래스가 부모클래스를 상속받으면 생성자에서 부모의 기본 생성자를 부르는 코드를 자동으로 생성해준다. public 자식클래스(){ super(); } 이때 부모에 기본생성자가 없으면 에러가 발생하기 때문에 매개변수까지 넣어서 딱 불러주면 오류 없어진다. 부모에서 private로 선언된건 접근할 수 없지만 상속은 받는다. 부모에서 선언된 애들은 자식의 참조변수를 통해 필드와 메소드로 접근가능하다. 메소드 재정의(= 메소드 오버라이딩) --> 다형성을 위해서 오버라이딩 규칙 1. 부모 메소드의 선언부와 동일해야 한다. 2. 접근 제한을 더 강하게 오버라이딩할 수 없다. ..
클래스 이어서 정적블록 정적필드를 초기화해주기 위해서 써주는 블록이다. main보다 먼저 클래스가 로딩될때 실행된다. static{ } 정적블록은 클래스가 메모리로 로딩될때 자동으로 실행된다. 정적블록이 여러개라면 선언된 순서대로 실행된다. 정적메소드 정적메소드와 정적 블록에서 인스턴스 멤버를 사용하려면 객체를 먼저 생성하고 참조변수로 접근해야한다. final 프로그램 실행 도중에 수정할 수 없게 하기 위해서 사용하는 변수를 상수화 하기 위한 키워드이다. 초기화 1. 필드 선언시에 초기값 대입 2. 생성자에서 초기값 대입 --> 초기화하지 않고 그대로 두면 컴파일에러 상수 선언 상수는 모든 객체에서 하나만 필요한 경우가 많다. 그래서 static변수로 선언해주면 부가적인 메모리를 잡아먹지 않는다. static fina..
로또뽑기 중복을 제거해서 랜덤함수를 6번만 수행하고 로또 숫자 6개를 뽑아라 int[] numbers = new int[45]; int[] lotto = new int[6]; // 6개의 번호를 저장할 배열 생성 for (int i=0;i