자바에서 상속을 이용하면 부모 클래스의 수정으로 모든 자식 클래스들도 수정되는 효과 때문에 유지보수 측면에서 효율성을 높일 수 있다. 그래서 객체지향 프로그래밍 특징 중에 상속이 포함되는 것이다. [상속 특징] 1. 현실에서 상속은 부모가 자식을 선택해서 물려주지만, 프로그램에서는 자식이 부모를 선택한다. 2. 현실에서도 부모를 여러명 가질수 없듯이, 프로그램에서도 단 하나의 부모만 가질 수 있다. 3. 부모 클래스가 private나 다른 패키지에 있고 default 접근 제한자를 가지고 있으면 상속을 할 수 없다. [자식클래스가 부모클래스를 사용할 수 있는 이유] 상속을 받은 자식 클래스의 객체가 생성되면 부모 객체가 먼저 생성되는데 그 이유는 자식 클래스의 기본 생성자에 있는 super() 함수로 부..
[final 필드] final 필드는 초기값이 정해진 이후 수정할수 없는 데이터라는 뜻이다. final 필드에 초기값을 줄 수 있는 방법은 2가지이다. 1. 필드 선언 시에 주는 법 2. 생성자에서 주는 법 만약에 위 2가지 방법으로 초기화를 안하면 아래처럼 에러가 발생한다. [final 클래스] 클래스에 final이 붙으면 상속을 허락하지 않겠다는 의미다. public final class 고양이 { } [final 메서드] 메서드가 final이면 오버라이딩을 금지하게 된다. [상수 설명과 특징] 상수는 한번 정하면 바꿀수 없어서, 불변의 값이라고 한다. 예를들어 원주율 이런것인데 자바에서 상수는 static final 이라고 부른다. 자바에서 final 필드는 한 번 초기화 되면 수정할 수 없는 필드..
싱글톤(Singleton)은 단 하나의 객체만 만들도록 보장하는데 대표적인 디자인 패턴중에 하나이다. 싱글톤을 디자인 패턴을 이해하려면 클래스 정적 멤버와 인스턴스 멤버의 메모리 사용 영역을 이해 해야 한다. [싱글톤 클래스 생성 단계] 1. 싱글톤은 만들려면 우선 외부에서 생성자를 호출 할 수 없어야 한다. 클래스 로더 시점에서 생성자를 통해 자동적으로 객체하나가 생성되고 그 후에는 생성되지 않게 하기 위함이다. 그래서 생성자 앞에 private를 붙여준다. 2. 정적 필드를 만드는데 이것도 다른 클래스에서 사용될수 없도록 private를 붙여주고 클래스로더 시점에 만들어지고 초기화 되어야 하기 때문에 정적 필드 만든다. 3. 마지막으로 만들어진 인스턴스를 가져오는 getInstance() 함수를 만들..
클래스로 부터 객체를 여러개 만들수 있는데 클래스 객체마다 모두 같은 데이터를 가지는 데이터가 있을때 모든 객체마다 해당 데이터를 가질 필요가 없다. 공유되는 해당 데이터를 가지는 필드를 한곳에 위치시키고 객체들이 공유 할 수 있게 하면 좋을 것이다. 자바에서 위 경우를 위해 클래스 멤버를 인스턴스 멤버와, 정적 멤버로 구분해서 선언할 수 있도록 한다. [정적 멤버] 인스턴스 멤버는 객체를 생성하고 그 객체를 참조해야 사용할 수 있지만 정적 멤버는 클래스에 고정된 멤버로서 객체를 생성하지 않고 사용할 수 있다. 정적 멤버로 사용하려면 앞에 static을 붙이는데 이때 필드와 메소드 앞에만 붙인다. 왜냐하면 생성자는 객체를 생성하기 위해서 있는 것이기 때문에 무조건 정적 멤버일 수 밖에 없다. 정적 멤버는..
[클래스 도입 이유] 학생1, 2의 데이터를 저장하고 그 데이터를 출력하는 프로그램을 만든다고 생각해보자 첫째로 그냥 변수에 학생 한명에 대한 데이터를 일일히 추가해서 출력하는 방법이 있다. 이 방법의 단점은 학생 한명을 추가할때마다 변수를 또 만들고 출력문도 생성해줘야 하는 번거로움이 있다. public class ClassStart1 { public static void main(String[] args) { String student1Name = "학생1"; int student1Age = 15; int student1Grade = 90; String student2Name = "학생2"; int student2Age = 16; int student2Grade = 80; System.out.prin..
[배열 객체 생성 방법] 배열은 같은 타입의 데이터를 연속된 공간으로 나열하고, 각 데이터에 인덱스를 부여해 놓은 자료구조 이다. 배열 생성할때 값을 초기화 할수 있는데 첫번째 방식으로 scores1은 new int[] 뒤에 값들이 놓여져 있고 scores2는 값들로만 초기화를 하였고 3번째는 배열 변수를 선언하고 값으로만 초기화 하려고했는데 에러가 발생하였다. scores2가 되는걸로 보아서 아마 컴파일러딴에서 변수 앞에 자료형이 있으면 자동으로 뒤에 new int[] 가 붙게 하는것 같다. 스택에 생성된 scores1의 값은 인덱스를 통해 각 값을 가져올 수 있다. scroes1[2] 은 87를 가져온다. 그럼 어떻게 값을 가 져올 수 있을까? 저장된 메모리 구조를 보면 이해 된다. [인덱스로 데이터..
자바는 크게 기본타입, 참조타입으로 분류 기본타입은 정수, 실수, 문자, 논리, 리터럴를 저장하는 타입이다. 참조타입은 객체의 번지를 참조하는 타입으로 배열, 열거, 클래스, 인터페이스를 말한다. 기본타입은 변수에 실제 값을 저장하지만 참조타입은 변수안에 메모리의 번지수를 저장한다. 번지를 통해 객체를 참조한다는 뜻에서 참조타입이라고 부른다. String은 클래스이기 때문에 문자열은 참조타입니다. 기본타입과 참조타입을 알아야 하는건 데이터가 자바에서 메모리 사용영역에 어떻게 할당되는지 알기 위해서이다. 자바에서 메모리 사용영역은 크게 아래 3가지로 나뉜다. [JAVA 메모리 3가지 사용영역] 1. 메서드 영역 : 메소드 영역은 JVM이 시작할 때 생성되고 모든 스레드가 공유하는 영역이다. 클래스로더로 클..
DB속도 개선을 하기 위해서는 실행 계획을 보고 인덱스를 타고 있는지 확인해야 한다. 그런데 무엇보다도 중요한건 쿼리가 효율적으로 돌아가는지 파악이 필요하다. 인덱스를 추가하기 전에 쿼리 부터 수정해야 할 필요가 있는지 확인하는게 중요하다. 회사에서 느리다고 하는 화면을 속도 개선해달라고 하는 요청때문에 쿼리를 뜯어보았다. 쿼리의 전체적인 부분을 이해하기 보다 그 전에 약 1000줄 되는 전체 SQL 문에서 느린 부분을 찾아내는것이 우선이다. 아래 쿼리가 느린 부분의 쿼리이다. 약 15초 정도 걸렸다. SELECT htl1.`hotel_id`, DATE_ADD('2024-11-01', INTERVAL `num` DAY) AS `date`, SUM( CASE WHEN hcl1grp.`close_date` ..
Text Filed에 스타일을 주고 싶은데 데이터에 해당 Text Filed에 서식을 무조건 주는게 아니라 데이터에 따라 스타일을 주고 싶을 때가 있다. 그러면은 conditionalStyle 을 사용하면 된다. [조건부 syle 조건과 서식 지정] conditionalStyle 사용 방법은 style 태그안에 넣고 그 style name을 text filed에 줘야 한다. 그리고 conditionalStyle 태그안에 conditionExpression 태그로 조건을 주고 또 style 태그로 서식을 건다. 이 style이 conditionExpression 태그의 조건에 부합하면 서식이 걸린다. [Table안의 Text Filed 스타일 지정] style을 주기위해서는 태그안에 있는
git의 stash 기능은 로컬에서 변경된 모든 파일을 로컬 워킹 디렉토리에 넣고 다른 작업을 하고 나중에 다시 불러와서 수정할 수 있는 방법이다. 이 기능은 여러가지 작업을 다발적으로 하게 될 때 도움이 많이 된다. [Stash 필요한 이유]만약 하나의 기능을 수정중이거나 만드는 중일때 특정 버그를 수정하는 일이 들어와서 바로 수정할 일이 있을 때 수정중인 파일을 그대로 냅두고 버그를 수정하고 커밋할때 수정중인 파일을 실수로 올리는 일도 있을것이고 기능 수정은 완료 했는데 나중에 커밋을 할때 stash 기능으로 워킹 디렉토리에 저장할때 사용한다.또 커밋하기에는 애매한데 다른 브랜치로 이동이 필요할때 변경 파일들을 stash 하고 다른 브랜치로 이동해서 작업한 후 다시 돌아와서 stash를 pop 하고 ..
[시스템 입력장치 출력장치] 프로그래밍 언어에는 시스템 표준 출력장치와 표준 입력장치가 있다. 일반적으로 표준 출력장치는 모니터이고, 표준 입력장치는 키보드이다. 자바 프로그래밍을 하고 결과값을 보기 위해서 아래 코드를 작성 했을 것이다. System.out은 시스템의 표준 출력장치를 말한다. System은 시스템이 가지고 있는, out은 출력 장치로, println()함수는 괄호안의 내용을 출력하고 행을 바꾸라는 뜻이다. System.out.println("출력 내용"); ※ println()은 행을 바꾸라는 뜻인데 행을 바꾸고 싶지 않으면 print() 함수를 사용하면 되고, 다양한 양식으로 출력하고 싶으면 printf() 함수를 알아보면 된다. 위와 반대로 시스템의 입력 장치는 System.in을 ..
갑자기 DB Lock 이 걸려 서버 장애가 생기는 경우가 있다. 그럴 경우 빠르게 Kill을 해줘서 장애를 해결 해야 한다. [DB Lock 걸린 트랜잭션 조회] 우선 트랜잭션 관련 아래 명령어 3개가 있다. 1번은 어떤 쿼리가 락을 걸어버렸는지 확인 할 수 있고, 2번은 락이 걸려 있는 테이블에서 작업하려고 대기중인 상태이고, 3번은 실행중인 트랜잭션이다. # 락을 걸어 버린 트랜잭션 확인 1. SELECT * from information_schema.INNODB_LOCKS; # 락이 걸려 대기중인 트랜잭션 2. SELECT * from information_schema.INNODB_LOCK_WAITS; # 트랜젝션 확인 3. SELECT * from information_schema.INNODB_T..