java

국비 코딩 풀스택 수업 37일차 라이브러리 추가, 몽고디비 연결, 제너릭 클래스

비루블 2022. 8. 16. 12:58

요약정리

변수, 생성자, 메소드, getter setter

가시성 // private(외부접근 불가), protected(직계가족), public(완전공유 외부에서 쓸 수 있게 됨.)

라이브러리 추가 방법

mongodb 연결하기

lombok 이라는 것을 사용해서 getter/setter/toString을 자동으로 해줄 수 있음.(나중에 알려주실 예정)

 

<실습>

랜덤(random),

for문 이용 최댓값(국어 점수 높은 사람 이름 가져오기), 

6명의 국어 점수 등수 구하기

학생별 합계, 평균 구하기(set이용 기입)

평균을 이용한 등수 구하기(set으로 기입)

 

 

exam_string > Ex01.java

package com.example.exam_string;

public class Ex01 {

    public void myPrint() {
        //2^32승의 숫자만 보관 
        int a  = 1; //정수, 소수점없음
        long b = 1L; //정수, 소수점없음

        float c=3.4f; // 실수, 소수점이 있음.
        double d=3.415f; // 실수, 소수점 있음.

        char e ='f'; // 문자1개
        char[] f = { 'h','e','l','l','o'}; //문자를 여러개 배열

        String str = "hello"; // 문자열

        if(str.equals("hello")) {
            System.out.println("YES");
        }

        for( int i = 0; i<str.length(); i++){
            System.out.print(str.charAt(i)+" ");
        }
        System.out.println();
        for(int i = str.length()-1; i>=0; i--){
            System.out.print(str.charAt(i)+" ");
        }

        float aaa = 5.1f;
        float bbb = 0.1f;
        if(aaa + bbb == 5.2){
            System.out.println("ddddddddddd");
        }
    }
}



Member.java

package com.example.exam_cls;

public class Member {
    
    // 아이디
    private String userid = null;

    // 암호
    private String userpw = null;

    // 이름
    private String username = null;

    // 나이
    private int userage = 0;

    // 점수
    private float userscore = 0.0f;

    // 1. 가시성 private(외부접근 불가), protected(직계가족), public(완전공유)
    // 2. 반환값 void(반환값 없음)
    // 3. getUserid(  4. 전달값 )
    public String getUserid() {
        return userid;
        // 여기서 return this.userid인데 this가 생략됨. 외부에서 getUserid를 쓰면 this.userid를 호출리턴 하는 것임
    }

    public void setUserid(String userid) {
        this.userid = userid;
        // this가 이 파일의 변수 userid임. 뒤에 붙은 userid는 받아온 것.
    }

    public String getUserpw() {
        return userpw;
    }

    public void setUserpw(String userpw) {
        this.userpw = userpw;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public int getUserage() {
        if(this.userage <= 0){
            return 100;
        }
        return this.userage;
    }

    public void setUserage(int userage) {
        this.userage = userage;
    }

    public float getUserscore() {
        return userscore;
    }

    public void setUserscore(float userscore) {
        this.userscore = userscore;
    }

    

}

 

마우스 오른쪽 클릭> source action>  getters and setters
모두선택 ok



함수 쫘악 만들어짐

외부에서 쓸 수 있게됨 (퍼블릭)

 

public String getUserid() {
    return userid;
}
// 여기서 return this.userid인데 this가 생략됨. 외부에서 getUserid를 쓰면 this.userid를 호출리턴 하는 것임


public void setUserid(String userid) {
    this.userid = userid;
    // this가 이 파일의 변수 userid임. 뒤에 붙은 userid는 받아온 것.
}

this의 생략


app.java에서 get함수 set 함수가 만들어짐.
사진참고


멤버에서 예시
obj는 한사람임.
obj와 obj1을 정의하고 obj에 str로 유저 id를 정의하고
obj1에 id를 호출했지만 null이 뜸.

개체를 만들면 독립된 개체를 만드는 것.


Book.java

생성자 중요(디폴트도 만들기)
action -> constructor -> 전체 ok

package com.example.exam_cls;


// 제목, 저자, 가격
public class Book {
    
    // 1. 변수
    private String title = null;
    private String writer = null;
    private int price = 0;
    
    
    // 책이라는 기본적인 것을 생성하고 가고 싶음. 생성자 만들기
    
    // 새로운 생성자를 만들면 자동으로 만들어진 것이 사라짐
    public Book() {
    }


    // 새로운 생성자를 만들면 자동으로 만들어진 것이 사라짐
    // 생성자를 추가하면 default 생성자도 만들어야됨. (2개 이상)
    // 2. 생성자
    // public 무조건, 반환값x, 함수명이 클래스명과 같음.
    public Book(String title, String writer, int price) {
        this.title = title;
        this.writer = writer;
        this.price = price;
    }
    


    // 3. 메소드 getter / setter

    public String getTitle() {
        return title;
    }


    public void setTitle(String title) {
        this.title = title;
    }

    public String getWriter() {
        // 문자를 내보내줌
        return writer;
    }

    public void setWriter(String writer) {
        // 문자 하나가 들어와야함. 이건 반환x
        this.writer = writer;
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

    
    // 할인된 가격으로 반환하기
    // ex) 10000 0.25 -> 7500
    // ex) 20000 0.5  -> 10000 
    public float getDiscount(float rate){
        float tmp = this.price - (this.price * rate);
        return tmp;
    }
}


book getdiscount(할인율)

할인율 기입후 할인된 가격으로 반환

 

 

exam_cls>

MathScore.java(메소드 실습)

package com.example.exam_cls;

public class MathScore {
    

    //변수 => 학년, 반, 점수(10개)
    //학년
    private String grade = null;
    //반
    private int classroom = 606;
    //점수 10개
    private int[] scores = null;
    
    
    
    //생성자
    public MathScore(String grade, int classroom, int[] scores) {
        this.grade = grade;
        this.classroom = classroom;
        this.scores = scores;
    }


    // 메소드 : 전체 점수 합구하기
    public int sumScore(){
        int sum = 0;
        for(int i = 0; i<this.scores.length; i++){
            sum += this.scores[i];
        }
        return sum;
    }

    // 메소드 : 전체 점수 평균 구하기
    public float avgScore() {
        // 정수 / 정수 => 정수
        // 실수 / 정수 => 실수
        return (float) sumScore() / (float) this.scores.length;
    }

    // 메소드 : 전체 점수 중에서 최소값
    public int minScore(){
        int min = this.scores[0]; //14
        for(int i = 1; i<this.scores.length; i++) {
            if(this.scores[i] < min) {
                min = this.scores[i];
            }
        }
        return min;
    }

    // 메소드 : 90점 이상인 점수 개수 구하기
    public int get90Score(){
        int cnt = 0;
        for(int i = 0; i<this.scores.length; i++){
            if(this.scores[i] >= 90){
                cnt++;
            }
        }
        return cnt;
    }

    //getter , setter
    public String getGrade() {
        return grade;
    }

    public void setGrade(String grade) {
        this.grade = grade;
    }

    public int getClassroom() {
        return classroom;
    }

    public void setClassroom(int classroom) {
        this.classroom = classroom;
    }

    public int[] getScores() {
        return scores;
    }

    public void setScores(int[] scores) {
        this.scores = scores;
    }
    
}

 

 

 

 

오후일과

exam_cls> MyArray.java

제너릭 클래스 <T>
private T data
타입을 안정해주고 자동으로 정해주는 것

package com.example.exam_cls;

// 제너릭 클래스 // 타입을 안정해주고 자동으로 정해주는 것
public class MyArray<T> {
    

    private T data;

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }
    
}

 

App.java 에서 

// MyArray클래스의 data 변수가 String 타입으로 동작
MyArray<String> obj = new MyArray<>();
obj.setData("aaa");
System.out.println(obj.getData());

// MyArray클래스의 data 변수가 Integer(int) 타입으로 동작
MyArray<Integer> obj1 = new MyArray<>();
obj1.setData(123);
System.out.println(obj1.getData() + 11);

 

제너릭을 훨씬 많이 씀


<라이브러리 추가방법>

https://mvnrepository.com/artifact/org.mongodb/mongo-java-driver
pom.xml에 몽고디비를 사용하기 위해서

<dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongodb-driver-sync</artifactId>
    <version>4.2.2</version>
</dependency>

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-simple</artifactId>
    <version>1.7.30</version>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.30</version>
</dependency>


위 코드를 기입해줌

하단에 알림창 나옴
Yes or Always

몽고디비 라이브러리 추가
사진참고

 

pom.xml

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>
    <!-- scanner는 여기 라이브러리에 있음 -->
  </properties>


mongDB에 연결하기
example > mongodb > BooksDB.java

package com.example.mongodb;

import java.util.Date;

import org.bson.Document;

import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCursor;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.result.InsertOneResult;

public class BooksDB {

    // 상수
    private final String url = "mongodb://id203:pw203@1.234.5.158:37017/db203";

    // 변수
    private MongoCollection<Document> collection = null;

    // DB에 연결하기
    public BooksDB() {
        MongoClient client = MongoClients.create(this.url);
        if(client != null){
            // System.out.println("DB접속성공");
            MongoDatabase db = client.getDatabase("db203");

            this.collection = db.getCollection("books");
            // System.out.println(collection.toString());

            // MongoCursor<String> cols =  db.listCollectionNames().iterator();

            // while(cols.hasNext()){ // 다음 것이 있으면 true, 없으면 fale
            //     // 다음 것을 가져오면서 출력하기
            //     System.out.println(cols.next());
            // }
        }
    }

    // 메소드 : 추가하기
    public int insert() { // 저장 하기
        try{
            Document doc = new Document();
            doc.append("_id", 22);
            doc.append("title", "제목");
            doc.append("author", "저자");
            doc.append("price", 1234);
            doc.append("regdate", new Date());
            InsertOneResult result = this.collection.insertOne(doc);
            System.out.println(result.getInsertedId());
            return 1;
        }
        catch(Exception e){
            e.printStackTrace(); //오류표시됨
            return 0;
        }
    }

    public void select() { // cursor()랑 iterator() 똑같은 말임. 리턴값도 똑같
        // iterator 반복자(포함된 개수 모름)
        // 가지고 온 것에서 한개라도 빼면 잘못된 것.
        // find()에 쿼리값 넣어서 가져오는 것이 출력에 용이
        MongoCursor<Document> list = this.collection.find().iterator();

        while(list.hasNext()){ // 가지고 올 다음 데이터가 있나요? 없으면 ㅌㅌ하세요.
            Document doc = list.next(); // 다음 것 가져오기

            // System.out.println(doc.toString()); // 전부 가져오기
            System.out.println(doc.getInteger("_id")); // 원하는 것만 들고오기
            System.out.println(doc.getString("title"));
        }
    }
    // public int delete() { // 삭제 하기
    //     this.collection.deleteOne(arg0);
    // }
}


데이터 가져올때 while문으로 iterator, hasNext
https://vaert.tistory.com/108
(Iterator 사용법)

art + shift + o

몽고디비에서 들고올때 어떻게 들고오는지 
.hashnext로 다음게 없을때까지(false) 들고와라

그리고 변수
private MongoCollection<Document> collection = null;
이걸 밖으로 빼주고 

모든 곳에서 쓰게 끔 만들음


// lombok 이라는 것을 사용해서 getter/setter/toString을 자동으로 해줄 수 있음.

아직 설명 안해주심

 

 

App.java

package com.example;

import java.util.Random;

import com.example.exam_cls.Book;
import com.example.exam_cls.MathScore;
import com.example.exam_cls.Member;
import com.example.exam_cls.MyArray;
import com.example.exam_cls.Student;
import com.example.mongodb.BooksDB;

// import java.util.Scanner;

// 파일명 == 클래스명 똑같아야함
// ex) Member.java == class Member
// ex) MemberJoin.java == class MemberJoin
public class App 
{
    public static void main( String[] args ){
        System.out.println("시작@@@@@@@@@@@@@@@@@@@@");
        Student[] s = new Student[6];
        Random rand = new Random();
        
        for(int i=0; i<s.length; i++) {
            int kor = rand.nextInt(100); // 0~100사이의 숫자생성
            int eng = rand.nextInt(100);
            int math = rand.nextInt(100);

            s[i] = new Student("이름"+i, (i+1), (i+100), kor, eng, math);
            // System.out.println(s[i].toString());
        }

        // 문제1) 6명의 전체 수학, 국어, 영어 점수
        System.out.print("국어 : ");
        for(int i=0; i < s.length; i++){
            System.out.print(s[i].getKor()+" ");
        }
        System.out.println();
        System.out.print("영어 : ");
        for(int i=0; i < s.length; i++){
            System.out.print(s[i].getEng()+" ");
        }
        System.out.println();
        System.out.print("수학 : ");
        for(int i=0; i < s.length; i++){
            System.out.print(s[i].getMath()+" ");
        }
        // 문제2) 6명 중에서 국어점수가 가장 높은 사람은?
        int max = s[0].getKor(); 
        String maxName = "이름1";
        for(int i =1;i<s.length;i++) {
            if(s[i].getKor() > max) {
                maxName = s[i].getName();
            }
        }
        System.out.println();
        System.out.println(maxName);


        // 문제3) 6명의 국어점수 등수 구하기
        int[] korrank = new int[s.length];
        for (int i = 0; i < s.length; i++) {
          int cnt = 1;
          for (int j = 0; j < s.length; j++) { // j번째 값의 등수 구하기
            if (s[j].getKor() > s[i].getKor()){
                cnt++; // 큰 값이 나올때마다 등수 올려주기
            } 
          }
          korrank[i] = cnt; // 등수 저장
        }
        for(int i = 0; i < s.length; i++){
            System.out.print(s[i].getName()+" : " + korrank[i]+ "등, ");
        }
        System.out.println();

        // 문제4) 학생별, 합계, 평균 구하기
        // obj.setUserid("aaa");
        // String str = obj.getUserid();
        // System.out.println(str);
        for(int i=0; i < s.length; i++){
            s[i].setTot(s[i].getKor()+s[i].getEng()+s[i].getMath());
            s[i].setAvg((s[i].getKor()+s[i].getEng()+s[i].getMath())/3);
        }

        for (int i = 0; i < s.length; i++) {
          int cnt = 1;
          for (int j = 0; j < s.length; j++) { // j번째 값의 등수 구하기
            if (s[j].getAvg() > s[i].getAvg()){
                cnt++; // 큰 값이 나올때마다 등수 올려주기
            } 
          }
          s[i].setRank(cnt);
        }
        for(int i=0; i < s.length; i++){
            System.out.println(s[i]);
        }
    }
}