| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | |||||
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
| 31 |
- Algorism study
- 게시판 리뷰 만들기
- 클래스 상속
- crud
- 내일배움카드
- array
- Spring
- AWS
- group study
- spring boot
- MegabyteSchool
- MVC 패턴
- 패스트캠퍼스
- tomcat
- 게시판 만들기
- 메가바이트스쿨
- MVC
- side project
- Entity
- github
- Interface
- Sts
- Java
- 클래스 class
- View
- #패스트캠퍼스 #국비지원교육 #메가바이트스쿨 #MegabyteSchool #개발자취업부트캠프 #내일배움카드
- #javaStudy
- GIT
- 국비지원교육
- 개발자취업부트캠프
- Today
- Total
tuter77
2023.01.02 TIL 본문
<목차>
<공부계획표>
13:00 ~ 14:00 Spring 온라인 강의 시청.
14:00 ~ 18:00 (3시간) 온라인강의 시청.
14:00 ~ 15:00 java 강의 시청
15:00 ~ 16:00 java 강의 시청
17:00 ~ 18:00 java 강의 시청
18:00 ~ 19:00 식사시간
19:00 ~ 22:00 java 실시간 강의
19:00 ~ 20:00 java 실시간 강의
20:00 ~ 21:00 java 실시간 강의
21:00 ~ 22:00 java 실시간 강의
22:00 ~ 23:00 블로그 작성 및 프로그래머스 문제 풀기.
<Spring 온라인 강의>
● local내 Spring을 활용하여 클래스 생성.
▷ 앞선 공부내용.
- Spring 3 툴인 STS설치와 사용할 WAS 서버인 Tomcat, 원격 컴퓨터인 AWS - window 인스턴스 생성등을 모두 마친상태이다.
- 이후 STS에서 ch2 프로젝트를 생성하여, 로컬 영역 내에서 웹에 프로그램을 호출시키는 공부를 했다.
▷애노테이션을 활용해, 브라우저에 메서드 호출하기.
사용한 애노테이션은 @Contoller, @RequestMapping 두가지이다.
먼저 Hello라는 클래스를 만들어 경로를 지정해준다.
spring에서의 경로지정은 꼭 거꾸로 해준다. (ex. com.fastcampus.ch2)
이후 Hello라는 클래스를 아래와 같이 만들었다.
package com.fastcampus.ch2;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class Hello {
int iv = 10;//인스턴스 변수
static int cv = 20;//static 변수
@RequestMapping("/hello") //private와 같은 접근제어자 상관없이 외부에서 호출가능.
private void main() { //인스턴스 메서드 - iv, cv 둘다 사용가능
System.out.println("Hello - private");
System.out.println(cv); //ok
System.out.println(iv); //에러
}//인스턴스 메서드는 객체를 생성후 호출된다.
public static void main2() { //static 메서드
System.out.println(cv); //ok
// System.out.println(iv); //에러
}
}
애노테이션 두가지는 import 했고, 아래 @Controller와 @RequestMapping의 용도가 나온다.
@Controller는 원격 호출가능한 프로그램으로 아래 클래스를 등록하는 것이다.
@RequestMapping은 URL과 아래 main() 메서드를 연결한다.
위의 클래스에서 main() 메서드는 static이 아닌 인스턴스 메서드로 선언했는데, 그 이유는 바로 아래 static 메서드인 main2() 메서드를 보면 알 수 있다.cv와 iv 두 가지 다른 변수를 선언해 main2() 에 입력해보면, static 변수는 실행가능하지만, 인스턴스 변수는 실행이 되지않는다.(java시간에 배웠지만 static은 인스턴스 생성전에 메모리에 생성되어있기 때문)
그러한 이유로 일반적인 인스턴스 메서드로 main()을 선언했다. 이후 tomcat을 통해 브라우저를 실행해보면 404에러 페이지가 뜨는데, 그건 프로그램 자체가 브라우저에 띄울것이 없기 때문이다.System.out.println 명령어는 콘솔창에 괄호안의 내용을 출력하는 것이고, STS콘솔창에 해당 내용이 출력되는것으로 잘 작동함을 알 수 있다.이 @RequestMapping은 외부에서 호출할땐 private로 접근제어자를 선언해도 정상 작동되게하는 강력한 기능을 갖고있다.
package com.fastcampus.ch2;
import java.lang.reflect.Method;
public class Main {
public static void main(String[] args) throws Exception{
// Hello hello = new Hello();
// hello.main(); //private 라서 외부 호출 불가.
//웹에서는 어떻게 호출 가능했나? Reflection API를 사용.
// 클래스 정보를 얻고 다룰 수 있는 기능 제공
// java.lang.reflect 패키지를 제공.
// Hello 클래스의 Class객체(클래스의 정보를 담고 있는 객체)를 얻어온다.
Class helloClass = Class.forName("com.fastcampus.ch2.Hell");
Hello hello = (Hello)helloClass.newInstance(); // Class객체가 가진 정보로 객체 생성.
Method main = helloClass.getDeclaredMethod("main");
main.setAccessible(true); //private인 main()을 호출 가능하게 한다.
main.invoke(hello); // hello.main() 과 같음
}
}
이후 Sping에서 개발할 때 Reflect API를 정말 자주사용하기에 간략하게나마 작동방식을 확인하기 위해 Main 클래스를 생성했다.위의 코드에서 주석 처리된 부분은 앞의 Hello클래스가 private로 선언되어 있어서 같은 패키지 내라도 생성자로 호출할 수 없다는 것을 보여준다.
때문에 Class.forName 메서드를 통해 Hello class 객체의 정보를 얻어오고 해당 정보로 객체를 생성한다.
그리고 Method를 통해 private main()함수를 호출하고 setAccessible을 통해 이용가능하게 한다.
이후 이 프로그램을 원격 컴퓨터에 복사해 넣고, 원격 컴퓨터에서 tomcat 구동 후 웹사이트에서 적용.
역시 콘솔창에 잘 나타남을 볼 수 있었다.
<Java>
● 상속에서 클래스 생성과정과 형 변환
▷하위 클래스가 생성되는 과정
- 하위 클래스를 생성하면 상위클래스가 먼저 생성된다.
- new VIPCustomer()를 호출하면 Custormer() 가 먼저 생성된다.
-예제를 통해 보면,
public Customer() {
customerGrage = "SILVER";
bonusRatio = 0.01;
System.out.println("Customer() call");
}
public VIPCustomer() {
bonusRatio = 0.05;
salesRatio = 0.1;
customerGrage = "VIP";
System.out.println("VIPCustomer() call");
}
이와 같이 코드를 작성했을때 Test클래스에서 vip만 호출해보면 customer 클래스가 먼저 호출되고 나서 vip 클래스가 호출되는 것을 볼 수 있다.
이는 생성자가 없는 경우 자바에서 super() 라는 생성자를 통해 상위 클래스를 자동으로 호출해주기 때문이다.
● java 복습
실시간 강의를 통해 온라인 강의 java 내용을 복습하다 금방 잊은 내용들을 다시 정리했다.
▷this
- 생성자를 통해 this 키워드를 전달할 수 있는데, 여러 클래스 간 하나의 객체를 전달해서 사용해야 하는 경우에도 유용하다.
- this 키워드를 사용해 현재 클래스의 메서드를 호출할 수 있는데, 따로 사용하지 않으면 컴파일러가 this 키워드를 자동으로 추가한다.
- 일반적으로 getter/setter 메서드에서 내부값을 할당하거나 접근할 때 사용한다.
-this는 각 인스턴스 메서드의 Stack Frame에 this라는 로컬변수로 메모리영역에 존재한다.
▷ static
- static 키워드는 주로 메모리 관리에 사용되는데 변수, 메서드, 블록, inner class에 사용할 수 있다.
- class에 선언된 static member들을 class member라고 하고, 각각 class variable 또는 class method 라고 부른다. 또한 class가 load 되어있는 동안 사용한다.
- class variable, method는 instance들 사이에서 공유하는데, 여러 Thread가 접근할 경우 동기화 문제가 발생하며, 이럴 경우 synchronize와 같은 방법을 사용해 한번에 하나의 thread만 사용할 수 있게 지정한다.
- 이러한 static method는 math class 처럼 산술계산, 날짜 변환등의 공통적으로 사용되는 기능일 경우 적용한다. 또한 static 객체 역시 회사, 지명 등 하나만 존재해야하는 변수의 경우에 적용한다.
- 메모리는 Heap영역이 아닌 Class Area에 존재하므로 instace를 통한 접근을 하지 않는다. (java 8버전 부터 Heap영역으로 이동했다.)
- 클래스명.멤버(변수 또는 메소드)로 접근한다.
▷ 정적 변수
- 앞서 살펴본 static variable, constant 는 java 8 버전 이전에는PermGen 메모리영여겡 저장되었으나, 8버전 이후로는 Heap 영역으로 옮겨져 GC의 대상이 되도록 변경되었다.- 이유는 기본 용량이 64 MB의 PermGen에 대량 데이터 저장응로 OutOfMemory error가 종종 발생했기 때문이다.

위와 같이 8버전 이후로는 OS가 용량을 관리해주는 형태로 바뀌었지만, 과도한 데이터로 OutOfMemory 에러가 날 수 있음은 매한가지이기에, 관리를 잘 해주어야한다.

▷static initializers
- 클래스에서 선언된 static initializers는 클래스가 초기화 될 때 실행되며, 클래스 변수에 대한 초기화에 사용된다.
실행 순서가 중요한데 class load > static initializer 실행 > 생성자 호출 순이다.
public class StaticInitializer {
static int age = 10;
static{
System.out.println("#1 static initializer 진입");
System.out.println("#2 static age 변수 접근 = " + age);
// afterVar 변수가 미리 선언되어 있지않아 compile Error 발생
// System.out.println("static afterVar is " + afterVar);
}
static int afterVar = 20;
StaticInitializer(){
System.out.println("#6 생성자 호출"); //6
}
static {
// System.out.println("static afterVar is " + afterVar);
System.out.println("#3 두번째 static initializer 진입");
}
public static void main(String[] args){
System.out.println("#5 메인 메서드 시작");
StaticInitializer s = new StaticInitializer();
System.out.println("#7 생성자 호출 후 초기화된 Non-static 변수 접근 : " + s.nonStaticVar);
}
static {
System.out.println("#4 세번째 static initializer 진입");
}
int nonStaticVar; //인스턴스 변수
}
위는 실행순서를 알아보기 위한 코드로 main()을 실행해보면, static 블록의 위치에 상관없이 class load > static initializer 실행 > 생성자 호출로 실행됨을 알 수 있다.
결과)

▷ static - Singleton Design Pattern
- 면접질문으로 다수 등장한다는 싱글톤 패턴은 앞서 살펴본바와 같이, 하나의 객체만 존재해야하는 경우 사용하는 디자인 패턴이다.
- 예시로 보면 아래와 같다.
final class Singleton {
private static Singleton s =new Singleton();
private Singleton(){}
public static Singleton getInstance(){
if(s == null){
s = new Singleton();
}
return s;
}
}
public class SingletonTest {
public static void main(String args[]){
//Singleton s = new Singleton();
Singleton s = Singleton.getInstance();
}
}
접근제어를 private로 선언해 해당 인스턴스를 함부로 생성할 수 없게 막아놓고, getInstance 메서드를 통해 인스턴스를 사용하게 한다.
아래 test 클래스에서 볼 수 있듯, static으로 선언 되었기 때문에 new로 접근하는 것이 아닌, getInstance 메서드를 통해 접근한다.
'TIL' 카테고리의 다른 글
| 2023.01.04 TIL (0) | 2023.01.04 |
|---|---|
| 2023.01.03 TIL (2) | 2023.01.03 |
| 2022.12.29 TIL (0) | 2022.12.29 |
| 2022.12.28 TIL (0) | 2022.12.28 |
| 2022.12.27 TIL (0) | 2022.12.27 |