클래스로 부터 객체를 여러개 만들수 있는데 클래스 객체마다 모두 같은 데이터를 가지는 데이터가 있을때 모든 객체마다 해당 데이터를 가질 필요가 없다. 공유되는 해당 데이터를 가지는 필드를 한곳에 위치시키고 객체들이 공유 할 수 있게 하면 좋을 것이다. 자바에서 위 경우를 위해 클래스 멤버를 인스턴스 멤버와, 정적 멤버로 구분해서 선언할 수 있도록 한다. [정적 멤버] 인스턴스 멤버는 객체를 생성하고 그 객체를 참조해야 사용할 수 있지만 정적 멤버는 클래스에 고정된 멤버로서 객체를 생성하지 않고 사용할 수 있다. 정적 멤버로 사용하려면 앞에 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이 시작할 때 생성되고 모든 스레드가 공유하는 영역이다. 클래스로더로 클..
[시스템 입력장치 출력장치] 프로그래밍 언어에는 시스템 표준 출력장치와 표준 입력장치가 있다. 일반적으로 표준 출력장치는 모니터이고, 표준 입력장치는 키보드이다. 자바 프로그래밍을 하고 결과값을 보기 위해서 아래 코드를 작성 했을 것이다. System.out은 시스템의 표준 출력장치를 말한다. System은 시스템이 가지고 있는, out은 출력 장치로, println()함수는 괄호안의 내용을 출력하고 행을 바꾸라는 뜻이다. System.out.println("출력 내용"); ※ println()은 행을 바꾸라는 뜻인데 행을 바꾸고 싶지 않으면 print() 함수를 사용하면 되고, 다양한 양식으로 출력하고 싶으면 printf() 함수를 알아보면 된다. 위와 반대로 시스템의 입력 장치는 System.in을 ..
[타입 변환] 타입 변환이란 데이터 타입을 다른 데이터 타입으로 변환하는 것을 말한다. 타입변환은 크게 자동 타입 변환(promotion)과 강제타입 변환(casting)이 있다. [자동타입 변환(Promotion)과 강제타입 변환(Casting)] 자동타입 변환은 값의 허용 범위가 작은 타입이 허용 범위가 큰 타입으로 저장될 때 발생한다. 정수형 끼리 자동 타입 변환은 허용범위가 큰 타입으로 저장하면 되지만 음수 범위가 없는 char 타입으로 자동 변환이 안된다. 정수형은 무조건 실수형으로 자동 타입 변환이 된다. 자동타입 변환과는 반대로 큰 허용 범위 타입에서 작은 허용 범위 타입으로 변하게 할때는 앞에 괄호안에 작은 허용 범위 타입을 써줘야 한다. 실수형을 정수형 타입에 넣을 때도 앞에 타입을 써줘..
[변수] 컴퓨터 메모리(RAM)는 값을 저장할 수 있는 수많은 번지(주소)들로 구성되어 있다. 변수는 값을 저장할 수 있는 메모리의 특정 번지에 붙이는 이름이다. 프로그램은 변수를 통해 메모리의 특정 번지에 값을 저장하고 읽을 수 있다. 따라서 메모리에 값을 저장하고 싶으면 변수를 써야 하며, 이 변수를 메모리의 어디에 저장하고 어떤 방식으로 저장할지는 프로그래밍 언어와 운영체제가 정한다. 자바의 경우는 JVM이 한다. [변수 사용] 변수 명으로 예약어는 쓸 수가 없는데 예약어는 이미 해당 프로그래밍 언어에서 의미를 갖고 사용되는 단어이다. 만약 사용하면 컴파일 에러가 발생한다. ※ 예약어 ex) boolean, true, try, void, return, private, class, import, fi..
모든 언어에서의 데이터 타입은 크게 원시 타입(primitive type)과 참조 타입(reference type)으로 구분된다. 원시 값은 메모리에 값이 그대로 할당된다. 하지만 참조 타입은 메모리에 실제 값이 있는 주소를 참조한다. 원시타입은 모든 숫자형, char, boolean 등이 있고, 참조 타입은 String, Class, Interface, 배열 등이 있다. String이 참조 타입이니 메모리에 실제 값이 있는 주소를 참조하게 된다. 원래는 메모리 영역이 스택과 힙으로 나눠 져서 구동 되지만 이해를 돕기 위해 하나의 메모리로 그림을 그렸다. 위 처럼 string name과 string name2는 값이 kang 으로 같은 값이지만 메모리의 주소는 다르다. == 는 메모리의 값을 비교 하므로..
자바 8부터 인터페이스의 변화로 기본 메서드와 스태틱 메서드가 추가 되었다. 인터페이스를 구현할때 공통적으로 제공해줬으면 하는 특정한 기능들이 필요되면서 추가된 것이다. 인터페이스를 상속받으면 인터페이스에 정의된 메서드들은 모두 구현이 돼야 한다. 하지만 구현이 안되어도 괜찮고, 그냥 특정한 기능만 있게 할수있도록 변화되었다. 기본 메서드(default method) 사용예제와 제약사항 public interface InterfaceChangeStudy { void printName(); //인터페이스에 정의된 메서드는 모두 public //기본 메서드 default void printNameUpperCase() { System.out.println(getName().toUpperCase()); } St..
콜론 두개(::)가 있으면 메서드 레퍼런스를 사용하는 것이다. 예제에 사용될 Greeting 클래스 public class Greeting { private String name; public Greeting() { } public Greeting(String name) { this.name = name; } public String hello(String name) { return "hello " + name; } public static String hi(String name) { return "hi " + name; } } 1. 스태틱 메서드 참조 Greeting 클래스에 있는 static 메서드 참조 방법 UnaryOperator hi = Greeting::hi; //UnaryOperator hi..
람다 기본 문법 람다 - (인자 리스트) -> {바디} (바디가 한줄일때는 {} 생략 가능) 인자 리스트 - 인자가 없을때 : () - 인자가 한개일때 : (one) 또는 one - 인자가 여러개 일때 : (one, two) - 인자의 타입은 생략가능, 변수선언부에 있는 인자타입으로 컴파일러가 추론하지만 명시할 수도 있다 (Integer one, Integer two) 바디 - 화살표 오른쪽에 함수 본문을 정의한다. - 여러 줄인 경우에 {}를 사용해서 묶는다. - 한 줄인 경우에 생략 가능, return도 생략 가능 함수형 인터페이스로 람다 사용방법 //Supplier 인자값 없이 T타입의 값을 제공하는 함수형 인터페이스 Supplier get10 = () -> 10; System.out.println..
스프링 시큐리티(Spring Security)를 사용하는 이유는 웹 애플리케이션 사용시 사용자 아이디와 비밀번호를 인증을 할 수 있게 하여 URL마다 특정 권한이 있는 사용자만 접속이 가능하게 할수도 있게 하고 사용자 비밀번호를 편하게 암호화 할 수 있다. 스프링 시큐리티 연동 스프링 시큐리티 사용하려면 아래 스프링 시큐리티 dependency 추가(test는 의존성은 추가 안해도됨) org.springframework.boot spring-boot-starter-security org.springframework.security spring-security-test test 스프링 시큐리티 의존성을 추가하고 나면 모든 요청은 인증을 필요로 하고, 기본 유저가 생성된다. Username : user Pa..