관리 메뉴

거니의 velog

230717 자바 강의 본문

대덕인재개발원_Java

230717 자바 강의

Unlimited00 2023. 7. 17. 20:07

[ArrayConversionEx.java]

package ddit.chap05.sec07;

import java.util.Random;

public class ArrayConversionEx {

	public static void main(String[] args) {
		
		ArrayConversion ac = new ArrayConversion();
		ac.histogram();
		ac.conversion();
		ac.printHisto();
		
	}

}

class ArrayConversion {
	
	private int[] dice = new int[6];
	private Random random = new Random();
	private char[][] histo;
	
	public ArrayConversion() {
		
		for(int i=0; i<50; i++) {
			// random class의 nextInt() : 정수형 난수 하나 발생.
			// nextInt(n) : 0 ~ (n-1) 사이의 정수형 난수 1개 발생.
			int rand = random.nextInt(6)+1; // 1~6 사이의 난수 발생.
			dice[rand-1]++; // 발생된 횟수를 1씩 증가.
		}
		
	}
	
	public void histogram() {
		
		for(int i=0; i<dice.length; i++) {
			System.out.print((i+1)+" | ");
			for(int j=0; j<dice[i]; j++) {
				System.out.print("#");
			}
			System.out.println(dice[i]);
		}
		
	}
	
	public int getMaxNum() {
		
		int rowCnt = dice[0]; // 임시최대값(행의 수)
		
		for(int i=1; i<dice.length; i++) { // 자기 자신을 제외한 다음 값(int i=1;)
			if(rowCnt < dice[i]) {
				rowCnt = dice[i];
			}
		}
		
		return rowCnt; // 최대값을 int형으로 리턴
		
	}
	
	public void conversion() {
		
		int r = getMaxNum(); // 행의 수
		
		histo = new char[r][6]; // 멤버 변수로 선언하여 printHisto() 함수와 공유
		
		for(int i=0; i<dice.length; i++) { // 열(6개)
			for(int j=0; j<dice[i]; j++) { // 행
				histo[j][i] = '#';
			}
		}
		
	}
	
	public void printHisto() {
		
		// histo.length-1 행의 갯수.
		// histo[i].length 그 행에 포함된 열의 갯수.
		for(int i=histo.length-1; i>=0; i--) {
			System.out.print("|");
			for(int j=0; j<histo[i].length; j++) {
				System.out.printf("%5c", histo[i][j]);
			}
			System.out.println();
		}
		
		System.out.println("--------------------------------");
		System.out.print(" ");
		for(int k=1; k<=6; k++) {
			System.out.printf("%5d", k);
		}
		
	}
	
}

콘솔 결과


[TwoDimensionArrayExample.java]

package ddit.chap05.sec05;

// 5명의 3과목 성적이 다음과 같다. 이를 배열에 저장하고 출력하시오.
// [데이터]
/* 국어   영어   수학
 *  75  80  65
 *  95  85  85
 *  65  85  85
 *  90  60  85
 *  95  90  95
 */

public class TwoDimensionArrayExample {
	
	static int[][] score; // 배열명 선언.
	static String[] name;

	public static void main(String[] args) {
		
		twoDimMethod01();
		printScore();
		sortData();
		
	}
	
	public static void twoDimMethod01() {
		
		// 데이터 입력
		score = new int[][] {{75, 80, 65, 0, 0, 1},
			                 {95, 85, 85, 0, 0, 1},
			                 {65, 85, 85, 0, 0, 1},
			                 {90, 60, 85, 0, 0, 1},
			                 {95, 90, 95, 0, 0, 1}}; // 가변형 배열로 선언.
			                 
		name = new String[] {"홍길동", "이순신", "김상훈", "이성계", "강감찬"};
		
		sumAvg();
		getRank();
			                 
	}
	
	public static void printScore() {
		
		// 데이터 출력
		// 바깥쪽 for는 행을, 안쪽 for는 열을 담당.
		System.out.println("----------------------------------");
		System.out.println("이   름  국어    영어    수학    총점    평균    등수");
		System.out.println("----------------------------------");
		for(int i=0; i<score.length; i++) { // 행
			System.out.print(name[i] + " ");
			for(int j=0; j<score[i].length; j++) { // 열
				System.out.printf("%5d", score[i][j]);
			}
			System.out.println();
		}
		
	}
	
	public static void sumAvg() {
		
		// 총점, 평균 구하기
		for(int i=0; i<score.length; i++) { // 행
			for(int j=0; j<3; j++) { // 열
				score[i][3] += score[i][j]; // 총점
			}
			score[i][4] = score[i][3] / 3; // 평균
		}
		
	}
	
	public static void getRank() {
		
		// 등수 구하기
		for(int i=0; i<score.length; i++) { // 기준값 위치
			for(int j=0; j<score.length; j++) { // 비교값 위치
				if(score[i][3] < score[j][3]) score[i][5]++;
			}
		}
		
	}
	
	public static void sortData() {
		
		// Bubble sort 적용
		for(int i=0; i<score.length-1; i++) {
			for(int j=0; j<score.length-1-i; j++) {
				if(score[j][3] < score[j+1][3]) {
					String tempName = name[j];
					name[j] = name[j+1];
					name[j+1] = tempName;
					for(int k=0; k<score[j].length; k++) {
						int tempRow = score[j][k];
						score[j][k] = score[j+1][k];
						score[j+1][k] = tempRow;
					}
				}
			}
		}
		System.out.println("\n\n\n");
		printScore();
		
	}

}

콘솔 결과


UML(Unified Modeling Language)

- UML이란 Unified Modeling Language의 약자로 1997OMG(Object Management Group)에서 표준으로 채택한 통합모델링언어 입니다. , 모델을 만드는 표준언어인 것입니다. 모델이란 것은 어떤 것을 실제로 만들 때 이렇게 만들면 잘 작동할지 미리 검증해 보는 것이며 실제 물건을 만드는 비용보다 비용이 훨씬 적을 경우에 모델을 만들어 설계를 검사합니다.

- 소프트웨어에서의 모델은 건축, 항공 등의 모델과는 좀 다른 면이 있습니다. 건물을 짓고, 항공기를 만드는 것과 설계를 그리고 만드는 것은 비용의 엄청난 차이가 있습니다. 하지만 UML 다이어그램을 그리며 모델을 만드는 일은 개발보다 비용이 적긴 하지만 훨씬 적게 드는 것이 아니며 때로는 오히려 개발보다 비용이 더 많이 들 수도 있습니다. 그래서 UML은 시험해 볼 구체적인 것이 있고, 그것을 코드로 시험해 보는 것보다 UML로 시험해 보는 쪽이 비용이 덜 들 때 주로 사용합니다. 이러한 목적으로 UML을 사용하는 유형에는 다음 3가지 정도가 있습니다.

(1) 다른 사람들과의 의사소통 또는 설계 논의

(2) 전체 시스템의 구조 및 클래스의 의존성 파악

(3) 유지보수를 위한 설계의 back-end 문서

- UML을 그리는데 가장 좋은 도구는 종이와 펜이라는 말이 있듯이 습관적으로 만드는 게 아니라 필요에 의해 만드는 것이 가장 좋은 것 같습니다.


Class Diagram (클래스 다이어그램)

클래스명
(+,-,#)속성
(+,-,#)행위

Has-a 관계(포함관계)

Car has a tire.(O)

Person has a hong.(X)

 

Is-a 관계


객체 new 연산자. heap 메모리 할당. 인스턴스(객체).

        - 생성자 메소드

 

객체를 구분하는 변수를 가지고 있는 것을 멤버 변수(필드)라 함. 메소드 밖에서 선언됨.

메소드 안에서 선언되는 변수는 지역변수. 반드시 초기화를 포함한다.

메소드는 각각의 객체들이 가지고 있는 행위.

대상들의 공통적 속성과 행위를 나열. 이를 뽑아서 대표적인 클래스로 생성.

 

일반 스칼라 변수

int sum = 0;

int[] sum = {0, 0};

단점 : 하나의 타입은 하나의 타입값만 넣을 수 있다. 다양한 타입의 데이터 취급 불가.

C언어는 구조체로 해결. 하나의 구조 안에 여러 타입의 데이터를 선언해서 사용 가능. 배열로도 선언 가능. 단점은 값만 저장. 행위를 저장할 수 없다.

자바에서는 구조체가 없다. 대신 자바는 [구조체 + 행위 => Class]로 환원 가능.

 

변수 선언은 Call Stack 메모리를 점유.

Heap 메모리 영역은 new 연산자로 인스턴스를 선언해야 점유 가능.

 

Person p1 = new Person();

p1Call Stack 메모리를 점유하고 값은 null; 객체가 저장될 공간 확보.

new Person()을 선언하면
(1) new 실행 : Heap 메모리 영역을 점유하고 Person()의 멤버변수 생성,
Stirng name = null; int age = 0;으로 초기화.
(2) Person() 생성자 메서드는 멤버변수에 값을 배정.
(3) 주소값을 p1에 전달.

 

p1.메서드();

p1.멤버변수; 사용 가능.


[접근 지정자] [제한자] class [클래스명] {

         멤버 필드

         멤버 메서드

}

 

[접근 지정자 4가지]

나를 불러다 쓸 수 있는 상대방의 지역 범위, 영역을 결정.

  같은 클래스 같은 package 다른 package
public O O O
protected O O (상속관계에서 자식일 경우)
default (생략 가능) O O X
private O X X

 

<객체 지향형 프로그래밍의 경우?>

(1) 상속이 지원되어야 함.

(2) 다형성이 지원되어야 함.

(3) 정보의 은닉화가 지원되어야 함. - Information Inhiding.
private 접근 지정자가 그 예시.

 

[제한자]

기능을 제한.

abstract : 추상화. 추상 클래스. 절대로 객체가 될 수 없다. new 연산자의 대상이 불가능.

final : 자식을 갖지 못하는 클래스. 종단 클래스. 더 이상 자식이 없으니 기능 확장이 불가능.
상속 예약어 : extends 가 불가능하다는 말.
초창기 사용 목적은 보안상. 해커들이 가장 쉬운 방법이 자식 클래스를 만들어 부모 클래스를 상속받는 경우. final 클래스는 그것이 불가능하다.
** 메서드 앞에서 붙으면 재정의 불가능 메서드.
** 변수 앞에 붙으면 상수가 된다.
double final pi = 3.1415926;

static: 정적.
          => 생성 : 프로그램이 (rom, ram 등의) 메모리에 load 될 때.
                          객체 생성 전(과거
                          new 연산자에 의해 객체 생성되는 시점(현재) : 클래스명으로 호출 
                                                                                                    [클래스명.변수;] [클래스명.메서드();]
           => static 변수는 methodliteral pool에 초기화가 딱 한 번만 일어난다.


[Student.java]

package ddit.chap06.sec01;

public class Student {
	String major;
	int studID;
	
	// 기본 생성자 생략. 인스턴스 생성시 컴파일러가 자동으로 넣어줌.
	// Student() {}
	
	@Override
	public String toString() {
		return "Student [major=" + major + ", studID=" + studID + "]";
	}
}

[StudentExample.java]

package ddit.chap06.sec01;

/*문제 1 -다음을 만족하는 Student 클래스를 작성하시오.
* · String형의 학과와 정수형의 학번을 필드로 선언
* · Student 클래스의 main() 메소드에서 Student 객체를 생성하여 학과와 학번 필드에 적당한 값을 입력 후 출력
*/

public class StudentExample {

	public static void main(String[] args) {
		
		Student std01 = new Student(); // 인스턴스 생성. 객체화.
		
		System.out.println("학과 : " + std01.major);
		System.out.println("학번 : " + std01.studID);
		System.out.println(std01.toString()); // 생성자 초기화. Student [major=null, studID=0]
		
		std01.major = "컴퓨터공학과";
		std01.studID = 2008102009;
		
		System.out.println("학과 : " + std01.major);
		System.out.println("학번 : " + std01.studID);
		System.out.println(std01.toString()); // Student [major=컴퓨터공학과, studID=2008102009]
		
	}

}

콘솔 결과


[TV.java]

package ddit.chap06.sec01;

// 문제 2 – main 메서드에서 실행시켰을 때 제조사, 생산년도, 크기를 출력하는 Tv클래스를 생성하시오.

public class TV {

	// 직접 초기화. 고정된 값을 갖는 객체를 무한히 생성할 때 사용.
	String company = "삼성전자";
	int year = 2022;
	double size = 60.5;
	
	{
		// 초기화 블록. 고정된 값을 갖는 객체를 무한히 생성할 때 사용.
		company = "LG";
		year = 2023;
		size = 75.5;
	}
	
	// 기본 생성자.
	public TV() {}
	
	// 생성자. 다양한 데이터를 가지고 다양한 객체를 생성.
	public TV(String company, int year, double size) {
		this.company = company;
		this.year = year;
		this.size = size;
	}

	@Override
	public String toString() {
		return "TV [제조사=" + company + ", 생산년도=" + year + ", 크기=" + size + "]";
	}
	
}

[TVExample.java]

package ddit.chap06.sec01;

public class TVExample {

	public static void main(String[] args) {
		
		TV t1 = new TV(); // 다른 생성자를 만들어 준 이후, 기본 생성자(public TV() {})를 만들어 줘야 오류 안생김.
		
		System.out.println("제조사 : " + t1.company);
		System.out.println("생산년도 : " + t1.year);
		System.out.println("크기 : " + t1.size);
		
		System.out.println(t1.toString());
		
		TV t2 = new TV("필립스", 2020, 55.0);
		
		System.out.println("제조사 : " + t2.company);
		System.out.println("생산년도 : " + t2.year);
		System.out.println("크기 : " + t2.size);
		
		System.out.println(t2.toString());
		
	}

}

콘솔 결과


[Grade.java]

package ddit.chap06.sec01;

import java.util.Arrays;

// 문제 3 – 세 과목의 성적을 입력 받고 총점과 평균을 출력할 수 있는 Grade class를 설계하시오.

public class Grade {
	
	private int[] score;
	private int sum;
	private double avg;
	
	public Grade() {}
	
	public Grade(int[] score, int sum, double avg) {
		this.score = score;
		this.sum = sum;
		this.avg = avg;
	}

	public int[] getScore() {
		return score;
	}

	public void setScore(int[] score) {
		this.score = score;
	}

	public void setSum(int sum) {
		this.sum = sum;
	}

	public void setAvg(int avg) {
		this.avg = avg;
	}

	public int getSum() {
		sum = 0;
		for(int i=0; i<score.length; i++) {
			sum += score[i];
		}
		return sum;
	}
	
	public double getAvg() {
		avg = 0;
		avg = (double)(sum / score.length);
		return avg;
	}

	@Override
	public String toString() {
		return "Grade [점수=" + Arrays.toString(score) + ", 총점=" + sum + ", 평균=" + avg + "]";
	}

}

[GradeExample.java]

package ddit.chap06.sec01;

public class GradeExample {

	public static void main(String[] args) {
		
		Grade g1 = new Grade(new int[]{90, 80, 70}, 0, 0.0);
		g1.getSum();
		g1.getAvg();
		System.out.println(g1.toString()); // Grade [점수=[90, 80, 70], 총점=240, 평균=80.0]
		
		Grade g2 = new Grade();
		g2.setScore(new int[] {50, 66, 92, 99});
		System.out.println("총점 : " + g2.getSum()); // 총점 : 307
		System.out.println("평균 : " + g2.getAvg()); // 평균 : 76.0
//		System.out.println(g2.toString());
		
	}

}

콘솔 결과

 

'대덕인재개발원_Java' 카테고리의 다른 글

230719 자바 강의  (0) 2023.07.19
230718 자바 강의  (0) 2023.07.18
230714 자바 강의  (0) 2023.07.14
230713 자바 강의  (0) 2023.07.13
230712 자바 강의  (0) 2023.07.12