Arrays.asList() 메소드를 사용하면 고정된 크기의 ArrayList를 만들 수 있다.

package chap15.list_collection;

import java.util.Arrays;
import java.util.List;

/* 고정된 크기의 ArrayList를 만들 때
 * Arrays.asList() 메소드를 사용한다.
 */
public class ArrayAsListExample {

	public static void main(String[] args) {
		// 고정된 크기의 ArrayList가 생성된다.
		List<String> list1 = Arrays.asList("홍길동", "신용권", "김자바");
		for(String name : list1) {
			System.out.println(name);
		}
//		list1.add("자바");	// 고정된 크기를 가지므로 추가를 할 수 없다.
		System.out.println(list1.size());
	}

}

위와 같이 생성됨 list에 새로운 문자열을 추가하려면 에러가 발생함을 알 수 있다. UnsupportedOperationException이 발생한다.

 

Posted by 세상을 살아가는 사람
,

한빛 아카데미에서 나온 박우창, 남송휘, 이현룡 지음, "MySQL로 배우는 데이터베이스 개론과 실습" 에 나오는 마당서점의 물리적 모델링으로 이큽립스에서 제공되는 ER Master 도구를 이용하여 작업을 해보았다.

firsterd.erm
0.04MB

이를 물리적 SQL 파일로 만들기 위해서는 이클립스에서 오른쪽 마우스를 클릭하여 아래 그림과 같이 "내보내기->DDL" 메뉴를 선택하면 데이터베이스 연동을 위한 sql 파일을 생성할 수 있다.

이를 이용하여 데이터베이스 테이블을 생성할 수 있다.

/* Drop Triggers */
DROP TRIGGER TRI_author_id;
DROP TRIGGER TRI_comment_id;
DROP TRIGGER TRI_tauthor_id;
DROP TRIGGER TRI_tcomment_id;
DROP TRIGGER TRI_topic_id;

/* Drop Tables */
DROP TABLE dormant CASCADE CONSTRAINTS;
DROP TABLE tcomment CASCADE CONSTRAINTS;
DROP TABLE twrite CASCADE CONSTRAINTS;
DROP TABLE tauthor CASCADE CONSTRAINTS;
DROP TABLE topic CASCADE CONSTRAINTS;

/* Drop Sequences */
DROP SEQUENCE SEQ_author_id;
DROP SEQUENCE SEQ_comment_id;
DROP SEQUENCE SEQ_tauthor_id;
DROP SEQUENCE SEQ_tcomment_id;
DROP SEQUENCE SEQ_topic_id;

/* Create Sequences */
CREATE SEQUENCE SEQ_tauthor_id INCREMENT BY 1 START WITH 1;
CREATE SEQUENCE SEQ_tcomment_id INCREMENT BY 1 START WITH 1;
CREATE SEQUENCE SEQ_topic_id INCREMENT BY 1 START WITH 1;

/* Create Tables */
CREATE TABLE dormant
(
	author_id number NOT NULL,
	created date NOT NULL,
	PRIMARY KEY (author_id)
);

CREATE TABLE tauthor
(
	id number NOT NULL,
	name varchar2(15) NOT NULL,
	introduction varchar2(100) NOT NULL,
	created date UNIQUE,
	PRIMARY KEY (id)
);

CREATE TABLE tcomment
(
	id number NOT NULL,
	description varchar2(4000) NOT NULL,
	created date NOT NULL,
	topic_id number NOT NULL,
	author_id number NOT NULL,
	PRIMARY KEY (id)
);

CREATE TABLE topic
(
	id number NOT NULL,
	title varchar2(30) NOT NULL,
	description varchar2(4000) NOT NULL,
	created date NOT NULL,
	PRIMARY KEY (id)
);

CREATE TABLE twrite
(
	author_id number NOT NULL,
	topic_id number NOT NULL,
	created date NOT NULL,
	PRIMARY KEY (author_id, topic_id)
);

/* Create Foreign Keys */
ALTER TABLE dormant
	ADD FOREIGN KEY (author_id)
	REFERENCES tauthor (id)
;

ALTER TABLE tcomment
	ADD FOREIGN KEY (author_id)
	REFERENCES tauthor (id)
;

ALTER TABLE twrite
	ADD FOREIGN KEY (author_id)
	REFERENCES tauthor (id)
;

ALTER TABLE tcomment
	ADD FOREIGN KEY (topic_id)
	REFERENCES topic (id)
;

ALTER TABLE twrite
	ADD FOREIGN KEY (topic_id)
	REFERENCES topic (id)
;

/* Create Triggers */
CREATE OR REPLACE TRIGGER TRI_author_id BEFORE INSERT ON author
FOR EACH ROW
BEGIN
	SELECT SEQ_author_id.nextval
	INTO :new.id
	FROM dual;
END;

/

CREATE OR REPLACE TRIGGER TRI_comment_id BEFORE INSERT ON comment
FOR EACH ROW
BEGIN
	SELECT SEQ_comment_id.nextval
	INTO :new.id
	FROM dual;
END;

/

CREATE OR REPLACE TRIGGER TRI_tauthor_id BEFORE INSERT ON tauthor
FOR EACH ROW
BEGIN
	SELECT SEQ_tauthor_id.nextval
	INTO :new.id
	FROM dual;
END;

/

CREATE OR REPLACE TRIGGER TRI_tcomment_id BEFORE INSERT ON tcomment
FOR EACH ROW
BEGIN
	SELECT SEQ_tcomment_id.nextval
	INTO :new.id
	FROM dual;
END;

/

CREATE OR REPLACE TRIGGER TRI_topic_id BEFORE INSERT ON topic
FOR EACH ROW
BEGIN
	SELECT SEQ_topic_id.nextval
	INTO :new.id
	FROM dual;
END;

/

firsterd.sql
0.00MB

나는 Erwin 프로그램의 사용에 제약이 있고, 이클립스에 익숙하여 쉽게 데이터베이스 테이블을 생성할 수 있기 때문에 이 방법을 사용하였다. 또한 Data Source Exploror를 같이 이용할 수 있는 장점이 있다.

이클립스에서 ER Master를 설치하는 방법은 Help->Install New Software에서 다음과 같이 입력하여 설치를 한다.

Posted by 세상을 살아가는 사람
,
Posted by 세상을 살아가는 사람
,

5개월간 자바 웹 개발자 교육을 마치고, 포트폴리오를 수행한 결과물을 발표한 것을 녹화한 것이다.

https://youtu.be/9T8ZnKoFPew

1. Pa-Bi 팔고 비우고 - 중고 경매 플랫폼

2. 골라줘 점심즈

4. Momentum_extension

3. All Food In The World

그동안 교육받는라 수고한 수강생분들에게 박수를 보냅니다.

Posted by 세상을 살아가는 사람
,

자바 프로그램으로 엑셀 파일을 읽어서 출력하는 프로그램을 구성해 본다.

엑셀 파일의 확장자가 .xls 인데, .xlsx로 변환하여 저장한 후 .xlsx 형식의 데이터 파일을 읽어서 필요한 정보를 출력하였다.

다음 사이트를 참조 하였다.

https://huskdoll.tistory.com/890

필요한 라이브러리는 poi-3.11.jar, poi-ooxml-3.11.jar, poi-ooxml-schemas-3.11.jar, xmlbeans-2.6.0.jar 이다. 이를 Java Build Path 설정에서 lib로 포함시켜 준다.

package excel;
 
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.List;

import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 
public class ExcelRead {
    public static void main(String[] args) {
    	List<String[]> list = new ArrayList<String[]>();
        try (FileInputStream file = new FileInputStream("C:\\Users\\ksseo\\Downloads\\시험문제(2022-01-22).xlsx");
                XSSFWorkbook workbook = new XSSFWorkbook(file);){
            int rowindex=0;
            int columnindex=0;
            //시트 수 (첫번째에만 존재하므로 0을 준다)
            //만약 각 시트를 읽기위해서는 FOR문을 한번더 돌려준다
            XSSFSheet sheet=workbook.getSheetAt(0);
            //행의 수
            int rows=sheet.getPhysicalNumberOfRows();
            for(rowindex=0;rowindex<rows;rowindex++){
            	
                //행을읽는다
                XSSFRow row=sheet.getRow(rowindex);
                if(row !=null){
                    //셀의 수
                    int cells=row.getPhysicalNumberOfCells();
                    String[] data = new String[cells];
                    for(columnindex=0; columnindex<=cells; columnindex++){
                        //셀값을 읽는다
                        XSSFCell cell=row.getCell(columnindex);
                        String value="";
                        //셀이 빈값일경우를 위한 널체크
                        if(cell==null){
                            continue;
                        }else{
                            //타입별로 내용 읽기
                            switch (cell.getCellType()){
                            case XSSFCell.CELL_TYPE_FORMULA:
                                value=cell.getCellFormula();
                                break;
                            case XSSFCell.CELL_TYPE_NUMERIC:
                                value=cell.getNumericCellValue()+"";
                                break;
                            case XSSFCell.CELL_TYPE_STRING:
                                value=cell.getStringCellValue()+"";
                                break;
                            case XSSFCell.CELL_TYPE_BLANK:
                                value=cell.getBooleanCellValue()+"";
                                break;
                            case XSSFCell.CELL_TYPE_ERROR:
                                value=cell.getErrorCellValue()+"";
                                break;
                            }
                            data[columnindex] = value;
                        }
//                        System.out.println(rowindex+"번 행 : "+columnindex+"번 열 값은: "+value);
                    }
                    list.add(data);
                }
            }
 
        }catch(Exception e) {
            e.printStackTrace();
        }
        for(int i = 0; i < 20 ; i++) {	// 20문제
        	int offset = generateRandomNumber();
        	int base = i * 9 + 1 + offset;
        	String[] problem = list.get(base);
        	System.out.println("[문제 " + (i+1) + "] " + problem[3]);
        	System.out.println("1. " + problem[9]);
        	System.out.println("2. " + problem[10]);
        	System.out.println("3. " + problem[11]);
        	System.out.println("4. " + problem[12]);
        	System.out.println();
        }
    }

	private static int generateRandomNumber() {
		return (int)(Math.random() * 9);
	}
}
Posted by 세상을 살아가는 사람
,

[문제 1] 다음 실행결과가 나오도록 ArrayList를 사용하여 동물(Dog Cat)을 추가하고, doWork() 메소드를 프로그래밍 하시오.

[Animal.java]
public interface Animal {
	String sound();
}

[Dog.java]
public class Dog implements Animal {
	private String name;
	
	public Dog(String name) {
		this.name = name;
	}

	@Override
	public String sound() {
		return "멍멍";
	}
	
	public String getName() {
		return name;
	}
}

[Cat.java]
public class Cat implements Animal {
	private String name;
	
	public Cat(String name) {
		this.name = name;
	}

	@Override
	public String sound() {
		return "야옹";
	}
	
	public String getName() {
		return name;
	}
}

[ListExample.java]
import java.util.ArrayList;
import java.util.List;

public class ListExample {
	public static void main(String[] args) {
		List<Animal> list = new ArrayList<Animal>();
		// 작성 위치 (1)
		// 1. 뚜루를 추가
		// 2. 나비를 추가
		
		doWork(list);
	}

	private static void doWork(List<Animal> list) {
		// 작성 위치 (2)
		// 실행결과와 같이 출력이 되어야 한다. (enhance for문 사용)

	}
}

[실행결과]
뚜루가 멍멍 소리를 낸다.
나비가 야옹 소리를 낸다.

[답안] list에 저장된 것은 interface Animal이며, 구현 객체의 이름을 꺼내기 위해서는 구현객체로 형변환을 해야 한다.

(1)에서 ArrayList에 추가한 것은 Dog, Cat 객체이므로 list에 저장된 Animal 타입을 Dog이나 Cat으로 강제 타입 변환을 해주면 이름(name)에 접근할 수 있다.

(1)
list.add(new Dog("뚜루"));
list.add(new Cat("나비"));

(2)
for(Animal animal : list) {
    if(animal instanceof Dog) {
        Dog dog = (Dog) animal;
        System.out.println(dog.getName() + "가 " + animal.sound() + " 소리를 낸다.");
    } else if(animal instanceof Cat) {
        Cat cat = (Cat) animal;
        System.out.println(cat.getName() + "가 " + animal.sound() + " 소리를 낸다.");
    }
}
Posted by 세상을 살아가는 사람
,

자바의 정석에 나오는 연습문제 4-12를 풀어본다. 답이 복잡한데, 나는 다르게 풀어서 공유를 한다. 문제는 아래와 같다.

나는 아래와 같이 3개의 반복문을 중첩해서 풀었다. 해결방법은 여러가지 이다.

public class Ex4_12 {

	public static void main(String[] args) {
		int i, k;
		for(k = 0;k < 3;k++) {
			for(int j = 1;j <= 3;j++) {
				int end = (4 + 3 * k) > 9 ? 9 : 4 + 3 * k;
				for(i = 2 + 3 * k;i < end;i++) {
					System.out.print(i + "*" + j + "=" + i * j + "\t");
				}
				System.out.println(i + "*" + j + "=" + i * j);
			}
			System.out.println();
		}
	}

}

실행결과는 아래와 같다.

아래 소스코드를 참조하면 좀더 이해가 될수 있다.

package chap04;

/*
2*1=2 3*1=3 4*1=4
2*2=4 3*2=6 4*2=8
2*3=6 3*3=9 4*3=12

5*1=5 6*1=6 7*1=7
5*2=10 6*2=12 7*2=14
5*3=15 6*3=18 7*3=21

8*1=8 9*1=9
8*2=16 9*2=18
8*3=24 9*3=27
 */
public class Ex4_12 {

	public static void main(String[] args) {
		int i, k;	// 반복문이 3개를 사용하므로 i, j, k
		for(k = 0;k < 3;k++) {	// k : 0~2 3번 반복
			for(i = 1;i <= 3;i++) {
				int j;
				int end = 4 + 3 * k;	// 종료조건
				if(end > 9)
					end = 9;
				for(j = 2 + 3 * k;j < end;j++) {	// (2,4), (5,7), (8,9)
					System.out.print(j + "*" + i + "=" + j*i + "\t");
				}
				System.out.println(j + "*" + i + "=" + j*i);
			}
			System.out.println();	// 줄 바꾸기
		}

		/*
		2*1=2 3*1=3 4*1=4
		2*2=4 3*2=6 4*2=8
		2*3=6 3*3=9 4*3=12
		*/
//		for(i = 1;i <= 3;i++) {
//			int j;
//			for(j = 2;j < 4;j++) {
//				System.out.print(j + "*" + i + "=" + j*i + "\t");
//			}
//			System.out.println(j + "*" + i + "=" + j*i);
//		}
//		System.out.println();	// 줄 바꾸기
//		/*
//		5*1=5 6*1=6 7*1=7
//		5*2=10 6*2=12 7*2=14
//		5*3=15 6*3=18 7*3=21
//		*/
//		for(i = 1;i <= 3;i++) {
//			int j;
//			for(j = 5;j < 7;j++) {
//				System.out.print(j + "*" + i + "=" + j*i + "\t");
//			}
//			System.out.println(j + "*" + i + "=" + j*i);
//		}
//		System.out.println();
//		/*
//		8*1=8 9*1=9
//		8*2=16 9*2=18
//		8*3=24 9*3=27
//		*/
//		for(i = 1;i <= 3;i++) {
//			int j;
//			for(j = 8;j < 9;j++) {
//				System.out.print(j + "*" + i + "=" + j*i + "\t");
//			}
//			System.out.println(j + "*" + i + "=" + j*i);
//		}
	}

}

여러가지 방법으로 풀 수 있으니 자신의 방법으로 풀어본다...

Posted by 세상을 살아가는 사람
,

이 문제는 풀이 방법이 다양한 것 같다. 이전에 기술한 것과 다르게 풀이를 해 보았다.

[문제] 구구단의 일부분을 다음과 같이 출력하시오.

[실행결과]

2*1=2 3*1=3 4*1=4

2*2=4 3*2=6 4*2=8

2*3=6 3*3=9 4*3=12

5*1=5 6*1=6 7*1=7

5*2=10 6*2=12 7*2=14

5*3=15 6*3=18 7*3=21

8*1=8 9*1=9

8*2=16 9*2=18

8*3=24 9*3=27

package practice;

public class Exercise4_12 {

	public static void main(String[] args) {
		for(int i = 2;i < 9;i += 3) {  // 크게 3부분으로 나누고
		cont:	for(int j = 1;j < 4;j++) {  // 각 부분을 풀되
				int k = 0;
				for(;k < 2;k++) {  // 탭을 출력하는 부분과
					System.out.print((i+k) + "*" + j + "=" + (i+k)*j);
					if(i+k == 9) {  // 마지막 9단일 경우는 별도로 처리를 해 보았다.
						System.out.println();
						continue cont;
					}
					else {
						System.out.print("\t");
					}
				}
				System.out.println((i+k) + "*" + j + "=" + (i+k)*j);  // \n을 출력하는 부분으로 나누고
			}
			System.out.println();
		}
	}
}

깨끗한 것 같지는 않다...

Posted by 세상을 살아가는 사람
,

PC 환경변수란?

자바 2022. 7. 13. 22:42

PC에서 사용자가 현재 작업 폴더에서 어떤 프로그램을 실행하기 위해서는

그 실행 프로그램이 어디에 위치하는지를 알아야 한다.

위의 그림에서 작업 폴더가 C:\Users\ksseo\Desktop에 위치한다고 가정하고

현재 PC에 존재하는 JVM(자바)의 버전 정보를 출력하기 위하여 java -version 명령어를 cmd창에서 입력한다.

보통 환경변수 path에 java.exe가 존재하는 경로를 설정하지 않았을 경우는 java.exe가 존재하는 경로를 포함하여 java.exe를 실행하여야 한다.

즉, 절대 경로를 사용하거나 상대경로를 사용하여 java.exe 명령어를 싷행하여야 한다.

예를 들어 절대경로를 사용할 경우는 "C:\Program Files\java\jdk1.8.0.311\bin\java" -version을 입력하여야 한다.

상대 경로를 사용할 경우는 현재 작업 폴더의 위치를 기반으로 java.exe 파일이 존재하는 위치를 알려주어야 한다. 즉, "..\..\Program Files\java\jdk1.8.0_311\bin\java" -version을 입력하여야 한다.

그러면 위의 그림과 같은 결과가 나타날 것이다.

그러나 이것은 효과적이지 못하다. 조금 복잡하다. 그냥 위의 그림과 같이 java -version과 같이 간단하게 실행파일의 이름만 사용하는 것이 편리하다. 그래서 그러한 방법을 제공하는 것이 환경변수 path이다.

cmd tool은 PC의 환경변수 path를 읽어둘여 실행파일이 환경변수 path 밑에 존재하는지를 먼저 check한후 있을 경우 그 실행파일을 실행한다.

이와 같이 내 작업 폴더와 다른 위치에 존재하는 실행파일을 실행하려면 환경변수 path에 실행하고자 하는 파일이 어디에 존재하는지를 설정해주면 작업자가 어느 위치에 있던지 관계없이 바로 실행파일의 이름만을 사용하여 실행할 수 있다.

Posted by 세상을 살아가는 사람
,

Posted by 세상을 살아가는 사람
,