tuter77

2022.12.28 TIL 본문

TIL

2022.12.28 TIL

tuter77 2022. 12. 28. 16:18

<목차>

  1. 공부계획표
  2. Java
  3. Spring
  4. 그룹스터디

시간을 제대로 활용하지 못해서 공부가 더 안되는 것같아 오늘부터는 시간표를 짜서 계획적으로 해보려고한다. 

 

<공부 계획표>

 

13:00 ~ 14:00 그룹스터디 

           무작정 만든 게시판 JPA활용, 확인받고 수정할 것 공부하기.

 

14:00 ~ 18:00 (3시간) 온라인강의 시청.

           14:00 ~ 15:00 Java강의 시청 : 목표 > 6강 듣기

           15:00 ~ 16:00 Spring 강의 시청 : 목표 > 3강 듣기

           17:00 ~ 18:00 JPA 강의 시청 : 목표 > 3강 듣기

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 블로그 작성 및 프로그래머스 문제 1개 풀기.

 

추가적으로 해야할 것.

JPA 개념이해 및 애노테이션, 롬복 이해.


<JAVA>

● 배열

- 배열 내부에는 중간에 자료가 빠지면 이어진 자료들을 당겨줘야한다.

[1,1,1,1,null,1,1,1]인 경우 [1,1,1,1,1,1]과 같이 변경.

 

▷배열 초기화 하기

- 배열은 선언과 동시에 자료형에 따라 초기화 된다.(정수는 0, 실수는 0.0, 객체는 null)- 필요에 따라 초기값을 지정할 수 있다. 

 

예시)int[ ] numbers = new int[ ] {10, 20, 30}; //개수 생략해야함.int[ ] numbers = {10, 20, 30}; // new int[] 생략가능int[ ] ids;ids = new int[ ] {10, 20, 30}; //선언 후 배열을 생성하는 경우는 new int[ ] 생략 불가.

 

▷ 배열 사용하기

- [ ] 인덱스 연산자 활용 : 배열요소가 저장된 메모리의 위치를 연산하여 찾아준다.

예시)

 

더보기

 

public class ArrayTest {
	
	public static void main(String[] args) {
		
		int[] arr = new int[10];//초기화가 된다. 
		// 또는 int[] arr = new int[] {1,2,3,4,5,6,7,8,9,10}; 직접 지정하는 초기화.
		int total = 0;
		
		for(int i=0, num=1; i<arr.length; i++) {
			arr[i] = num++;
	
		}
		for(int num : arr) {//처음부터 끝까지 볼때 inhance array
			total += num;
		}
		//중간에 자르게 되는 경우 index 핸들링이 필요함.
		System.out.println(total);
	}

}

위 처럼 inhanced array로 자주사용하고, 중간에 다른 값이 필요없으면 if continue등을 이용해 인덱스를 핸들링 해야한다.

 

▷ 배열의 길이와 요소(데이터)의 개수.

- 배열을 선언하면 개수만금 메모리가 할당되지만, 실제 데이터가 없는 경우도 있다.

- 배열의 length속성은 배열의 개수를 반환해주기 때문에 데이터의 개수와는 다르다.

- length 활용시 오류가 나는 경우.

double[] dArr = new double[5];

dArr[0] = 1.1;
dArr[1] = 2.1;
dArr[2] = 3.1;

double mtotal = 1;
for(int i=0; i<dArr.lenth; i++){
         mtotal *= dArr[i];
}
System.out.println(mtotal);

 

남은 배열의 초기값이 0이기 때문에 곱하기를 하면 결과가 당연히 0이 나오는 오류가 발생한다. 

이런경우 요소의 개수에 대한 변수(count)를 따로 유지한다.

double[] dArr = new double[5];
int count = 0;
dArr[0] = 1.1; count++
dArr[1] = 2.1; count++
dArr[2] = 3.1; count++

double mtotal = 1;
for(int i=0; i<count; i++){
         mtotal *= dArr[i];
}
System.out.println(mtotal);

 

count 까지만 for문이 돌기 때문에 오류가 없다.

 

▷ 문자 배열을 만들어 A-Z까지 배열에 저장하고 이를 다시 출력하기(향상된 for문 사용하기.)

 

더보기

 

public class CharArrayTest {

	public static void main(String[] args) {
		
		char[] alphabets = new char[26];
		char ch = 'A';
		
		for(int i=0; i<alphabets.length; i++) {
			
			alphabets[i]=ch++;//알파벳은 유니코드에 숫자로도 나오기때문에 쭉 더해진다.
			
		}
		for(char alpha : alphabets) {
			System.out.println(alpha + "," + (int)alpha);
		}
	}
	

}

 

위의 실습처럼 문자열도 배열로 지정가능하며, 유니코드를 이용하면 알파벳과 같은 것은 for문으로 자동으로 배열에 입력할 수 있다.

 

▷ 객체 배열  선언과 구현.

- 기본 자료형 배열은 선언과 동시에 배열의 크기만큼의 메모리가 할당되지만, 객체배열의 경우엔 요소가 되는 객체의 주소가 들어갈(4바이트, 8바이트) 메모리만 할당되고(null로) 각 요소 객체는 생성하여 저장해야한다.

 

예제)

더보기
public class Book {

	private String title;
	private String author;
	
	public Book() {}
	public Book(String title, String author) {
		this.title = title;
		this.author = author;
	}
	
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getAuthor() {
		return author;
	}
	public void setAuthor(String author) {
		this.author = author;
	}
	
	public void showInfo() {
		
		System.out.println(title + "," + author);
	}
	
	
}

 

book 클래스를 만들어 멤버변수로 책제목과 저자를 선언한다. 생성자를 하나만들고, 생성자에 매개변수로 title과 author를 지정해준다.아래는 private로 선언된 변수들을 호출하거나 수정할 get/set 메서드이고 그 아래엔 간단히 정보를 보여줄 메서드를 만들었다.

 

더보기
public class BookTest {

	public static void main(String[] args) {

		Book[] library = new Book[5];
		
//		for(int i=0; i<library.length; i++) {
//			System.out.println(library[i]);
//		}// 그냥 출력하면 null로 나옴.
		
		library[0] = new Book("태백산맥1", "조정래"); //이처럼 객체를 만들어서 넣어야한다.
		library[1] = new Book("태백산맥2", "조정래");
		library[2] = new Book("태백산맥3", "조정래");
		library[3] = new Book("태백산맥4", "조정래");
		library[4] = new Book("태백산맥5", "조정래");
		
		for(Book book : library) {
			System.out.println(book);
			book.showInfo();
		}
		
	}

}

 

테스트할 클래스를 새로만들어 library 배열을 선언해주고 객체의 주소들이 저장될 개수를 5로 설정했다.

가운데 주석처리된 부분은 생성된 배열안이 null값으로 들어있는지 확인하기 위함이다.그 아래에 배열[인덱스]로 객체(매개변수)를 생성해주고 객체의 주소와 정보를 향상된 for문으로 출력해보았다.

 

▷객체 배열 복사하기.

- System.arrayCopy(src, srcPos, dest, destPos, length) 를 사용하는데 이는 자바에서 제공되는 배열복사 메서드이다.

(static 메서드이며, 매개변수로는 소스가 되는 array,  소스 어디서부터, 어디로, 어디부터, 배열의 몇개를 복사할 것인가 가 들어간다.)

그림으로 보면, 1. src array

(index)0 1 2 3 4

 

2. destination array

(index)0 1 2 3 4

소스 arr의 어디 인덱스(srcPos)부터 몇개(length)를 dest arr의 어디로(destPos) 보낼것인지를 매개변수로 결정한다.

src[0]에서 src[4]까지 복사하는데 dest[2]부터 넣는다고 하면 배열의 크기가 안맞아 오류가 나게된다.

- 얕은 복사는 객체 주소만 복사되어 한쪽 배열의 요소를 수정하면 같이 수정된다(즉, 두 배열이 같은 객체를 가리킨다.)

예시) System.arraycopy(library, 0, copyLibrary, 0, 5);

 

때문에 복사된 배열이 다른 객체를 갖게 하고싶으면, 새로운 객체를 생성해야한다. 

그 새로운 객체에 이전 객체의 내용만 복사해서 붙여넣어주면 된다.

 

예시)

더보기
public class ObjectCopyTest {

	public static void main(String[] args) {

		Book[] library = new Book[5];
		Book[] copyLibrary = new Book[5];//복사용 배열.
		
		library[0] = new Book("태백산맥1", "조정래"); //이처럼 객체를 만들어서 넣어야한다.
		library[1] = new Book("태백산맥2", "조정래");
		library[2] = new Book("태백산맥3", "조정래");
		library[3] = new Book("태백산맥4", "조정래");
		library[4] = new Book("태백산맥5", "조정래");
	

		copyLibrary[0] = new Book(); //일단 default 객체만 선언.
		copyLibrary[1] = new Book();
		copyLibrary[2] = new Book();
		copyLibrary[3] = new Book();
		copyLibrary[4] = new Book();
		
		for(int i=0; i<library.length; i++) {
			copyLibrary[i].setAuthor(library[i].getAuthor());
			copyLibrary[i].setTitle(library[i].getTitle());
		}
		
		library[0].setAuthor("박완서");
		library[0].setTitle("나목");
		
		System.out.println("== library =="); //원래배열
		for(Book book : library) {
			System.out.println(book);
			book.showInfo();
		}
		
		System.out.println("== copyLibrary =="); //복사된 배열
		for(Book book : copyLibrary) {
			System.out.println(book);
			book.showInfo();
		}
	}

 

위 예제 처럼 새로 객체를 생성한 뒤 for문과 get/set 메서드를 이용해 내용을 복사해서 붙여넣은 후 출력해보면, 주소와 내용이 다르게 저장되는 것을 볼 수 있다.

 

● 2차원 배열

▷ 다차원 배열

-  이차원 이상으로 구현 된 배열-  평면(2차원 배열) 이나 공간(삼차원 배열)을 활용한 프로그램 구현.-  2차원 배열은 DB테이블과 같이 행열로 이루어진 배열이다. 예제) (중첩for문이 유사하다.)

arr[0][0] arr[0][1] arr[0][2]
arr[1][0] arr[1][1] arr[1][2]

 

예시)

더보기
public class TwoDimensionTest {

	public static void main(String[] args) {

		int[][] arr = {{1,2,3}, {1,2,3,4}};
		
		int i,j;
		
		for(i=0; i<arr.length; i++) {
			
			for (j=0; j<arr[i].length; j++) {
				System.out.print(arr[i][j] + ",");//한 행 출력
			}
			System.out.println("\t" + arr[i].length);
		}
	}

}

 

위의 예시처럼,  각 요소를 일일히 입력해주는 경우와, 틀만 new int[3][4]처럼 지정하는 경우 두가지가 있다. 

for문을 사용하면 아래와 같이 값을 일일히 찍어볼 수 있다.(구구단처럼)

 

●  객체 배열을 구현한 클래스 ArrayList

 

▷java.util패키지에서 제공되는 ArrayList

- 기존의 배열 선언과 사용방식은 배열의 길이를 정하고 요소의 개수가 배열의 길이보다 커지면 배열을 재할당하고 복사해야 했다.

- 배열의 요소를 추가하거나 삭제하면 다른 요소들의 이동에대한 구현을 해야한다.

- ArrayList는 객체 배열을 좀 더 효율적으로 관리하기위해 제공되는 클래스이며, 이미 많은 메서드들이 최적의 알고리즘으로 구현되어있어, 각 메서드의 사용 방법만 익히면 유용하게 쓸 수 있다.

아래는 유용한 메서드들과 설명이다.

이 메서드들이 궁금하면 에디터 내에서 ArrayList(뿐아니라 여러 라이브러리도 동일)을 블럭 처리한 후 F1을 누르게되면 안의 내용들을 살펴볼 수 있다.)

  • boolean add(E e) : 요소 하나를 배열에 추가한다. E는 요소의 자료형을 의미한다.
  • int size() : 배열에 추가된 요소 전체 개수를 반환한다.
  • E get(int index) : 배열의 index위치에 있는 요소값을 반환한다.
  • E remove(int index) : 배열의 index위치에 있는 요소값을 제거하고 그 값을 반환한다.
  • boolean isEmpty() : 배열이 비어있는지 확인한다.

 

예시)

더보기
package ch23;

import java.util.ArrayList;
import ch21.Book;

public class ArrayListTest {

	public static void main(String[] args) {

		ArrayList<Book> library = new ArrayList<>(); //<>안에 지정해준다.
		
		library.add(new Book("태백산맥1", "조정래")); //.add사용,객체를 new로 생성하면서 넣는다.
		library.add(new Book("태백산맥2", "조정래"));
		library.add(new Book("태백산맥3", "조정래"));
		library.add(new Book("태백산맥4", "조정래"));
		library.add(new Book("태백산맥5", "조정래"));
		
		for(int i =0; i<library.size(); i++) { //size로 length를 대체해 요소의 개수만 가져온다.
			library.get(i).showInfo(); // f1을 눌러서 메소드들을 확인할 수 있다.
			
		}
		
	}

 

▷ArrayList를 활용한 성적 산출 프로그램.

 

- 예제 시나리오. 

1001학번 Lee와 1002학변 Kim, 두 학생이 있다.

lee학생은 국어와 수학 2과목을 수강했고, kim학생은 국어, 수학, 영어, 3과목을 수강했다.

lee학생의 국어는 100점, 수학은 50점이며, kim학생의 국어는 70점, 수학은 85점, 영어는 100점이다.

Student와 Subject 클래스를 만들고 ArrayList를 활용하여 두 학생의 성적과 총점을 출력하라.

 

Student 클래스

 

아래 보기

더보기
package ch24;

import java.util.ArrayList;

public class Student {
	
	int studentID;
	String studentName;
	ArrayList<Subject> subjectList;
		
	public Student(int studentID, String studentName){
		this.studentID = studentID;
		this.studentName = studentName;
		
		subjectList = new ArrayList<Subject>();
	}
	
	public void addSubject(String name, int score){
		Subject subject = new Subject();
		
		subject.setName(name);
		subject.setScorePoint(score);
		subjectList.add(subject);
	}
	
	public void showStudentInfo()
	{
		int total = 0;
		
		for(Subject s : subjectList){
			
			total += s.getScorePoint();
			System.out.println("학생 " + studentName + "의 " + s.getName() + " 과목 성적은 " + 
			        s.getScorePoint() + "입니다.");
		}
			
		System.out.println("학생 " + studentName + "의 총점은 " + total + " 입니다.");
	}
}

 

Subject 클래스

 

아래 보기

더보기
package ch24;

public class Subject {
	
	private String name;
	private int scorePoint;
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getScorePoint() {
		return scorePoint;
	}
	public void setScorePoint(int scorePoint) {
		this.scorePoint = scorePoint;
	}
}

 

StudentTest 클래스(기능구현)

 

아래 보기

더보기
package ch24;

public class StudentTest {

	public static void main(String[] args) {
		Student studentLee = new Student(1001, "Lee");
		
		studentLee.addSubject("국어", 100);
		studentLee.addSubject("수학", 50);
		
		Student studentKim = new Student(1002, "Kim");
		
		studentKim.addSubject("국어", 70);
		studentKim.addSubject("수학", 85);
		studentKim.addSubject("영어", 100);
		
		studentLee.showStudentInfo();
		System.out.println("======================================");
		studentKim.showStudentInfo();
	}
}

 

이렇게 Java 온라인강의 2번째 챕터를 마무리했다. java강의에 시간이 밀려 Spring강의는 아쉽게도 듣지못했다. 내일은 꼭 들어야지..

 


 

<Spring>

● 내일로 미룸.


<그룹스터디 과제>

 

앞서 진행한 Delete 기능 구현의 코드를 가져왔다. (수정이후의 코드)

MainController{

      @DeleteMapping("/delete") //송영진
      public ResponseEntity<Boolean> getDelete(@RequestParam Long id){
                return ResponseEntity.ok(boardService.deleteBoard(id));
      }
}

메인컨트롤러에서 딜리트 매핑을 사용하여 클라이언트의 요청에 응답한다. 

(매핑의 개념에대해 따로 공부해야 한다.)

보면 리스폰스엔티티 형태는 불린으로, Long 타입의 id값을 Requestparam으로 받는 getDelete메서드로 삭제요청을 받는다.  이 요청을 boardService 클래스의 deleteBoard(id값)로 전달하게 된다.처음에 내가 작성할 때는 아무생각없이  deleteBoard의 매개변수를 LongValue로 받으려했었다.하지만 매개변수의 형태를 Long으로 통일하지 못했었던걸 간과했다.. BoardService의 deleleBoard에서는 DTO타입(BoardRequestDTO boardRequestDTO)으로 매개변수를 선언해놓고, 여기 컨트롤러에서는 long타입으로 뒤죽박죽 섞어 선언하여 제대로 작동하지 않았던 것이다.

 

public interface BoardService {

    public boolean deleteBoard(Long boardRequestDTO);
    //TOdO: 영진

}

위 코드는 BoardService 클래스 내부에 선언된 Boolean값의 deleteBoard 객체이다. 이 메서드는 boardRequestDTO값들을 Long 타입 매개변수로 받는다.(DTO에대해서는 따로 공부하려고한다.)

 

@Service
@RequiredArgsConstructor
public class BoardServiceImpl implements BoardService {

    private final BoardRepository boardRepository;

    @Override
    public boolean deleteBoard(Long id) {
        boardRepository.deleteById(id);

        return true;
    }
}

보기에 좋게 delete외에는 모두 지운 코드이다. 

이 클래스는BoardService를 상속받은(implements) BoardService클래스인데, 보면 BoardRepo클래스의 생성자 boardReop- 를 참조하고 있음을 알 수 있다. 

@Override 애노테이션 아래에 deleteBoard 메서드가 있는데, Long 타입 id값을 매개변수로 받아 레포지토리에서 id값에 해당하는 데이터를 deleteById로 지우는 역할을 한다. 수행이 잘되면, true를 안되면 false를 반환한다. 

 

이번 스터디로 스프링 툴에서 메인컨트롤러와 서비스 객체, 레포지토리(저장소), 데이터베이스가 각각 어떻게 협업하는지 대충이나마 감을 잡았다. 

따로 공부해야할것들이 많지만, 우선적으로 매핑, Rquest/ResponseDTO, Optional 등을 공부해야한다.

 

● 페이징 작업

▷레포지토리에서 데이터 가져오는 메서드 만들기.

 

'TIL' 카테고리의 다른 글

2023.01.02 TIL  (0) 2023.01.02
2022.12.29 TIL  (0) 2022.12.29
2022.12.27 TIL  (0) 2022.12.27
2022.12.26 TIL  (0) 2022.12.26
2022.12.23 TIL  (0) 2022.12.23