< 지난 포스팅 정리 >
자료
- 자료형
기본자료형: boolean, char, byte, short, int, long, float, double
참조자료형: 배열(array)
- 변수/상수
변수선언 => 자료형 변수명;
상수선언 => final 자료형 변수명;
이름선언
1. 식별자 규칙 -에러
2. 표기법
변수: 소문자로 시작
상수: 대문자로 구성, _표기
- 형변환
자동(묵시적)형변환
강제형변환
- 연산자
산술연산자
증감연산자
대입연산자
복합대입연산자
비교연산자
논리연산자
---------------
비트연산자(이진수 연산 -IoT/ Graphic)
제어
조건에 의한 분기
if~else~
if~ else if~ else~
switch~case~default~
조건에 의한 반복
for
while
do~while
break,continue
[Array]
선언과 생성
선언- 변수명
자료형[] 변수명;
자료형 변수명[];
생성 - 저장공간
변수명 = new 자료형[];
int scores; //선언
scores = new int[5]; //생성
배열의 선언, 사용방식
* ArrayEx01.java
public class ArrayEx01 {
public static void main(String[] args){
//배열의 선언
int[] arr1;
//System.out.println(arr1); 배열을 초기화하지 않으면 에러남
//배열의 생성
arr1= new int[3];
System.out.println(arr1); //[I@4517d9a3 배열을 생성한 후 배열을 출력하면 저장주소가 뜸
//배열의 초기화
arr1[0]=10;
arr1[1]=20;
arr1[2]=30;
System.out.println(arr1[0]);
System.out.println(arr1[1]);
System.out.println(arr1[2]);
int a;
a=10;
System.out.println(a); //기본 자료형에는 값이 들어있는 것
//참조 자료형에서는 값이 아닌 값이 있는 주소가 들어있는 것이다.
}
}
## arr1[3]이라는 공간이 없는데 해당 배열에 값을 할당한 경우
=> compile은 되지만, 실행할 때 에러발생 (만들어진 배열에는 해당 공간이 없다는 내용의 에러)
//Compile에러는 없음
//runtime에러 = Exception(에러의 다른 표현)
//ArrayIndexOutOfBoundsException
//arr1[3]=40;
System.out.println(arr1[2]);
//System.out.println(arr1[3]); //ArrayIndexOutOfBoundsException
* ArrayEx03.java - 선언과 생성, 배열 안 정수 내용 확인
public class ArrayEx03 {
public static void main(String[] args){
//선언과 생성을 분리
int[] arr1;
arr1= new int[3];
//선언과 생성을 통합
int[] arr2= new int[3];
//선언과 생성과 초기화 통합
int[] arr3 = new int[]{10,20,30};
int[] arr4 = {10,20,30};
System.out.println(arr1.length);
System.out.println(arr2.length);
System.out.println(arr3.length);
System.out.println(arr4.length);
/* for(int i=0;i<arr4.length;i++){ //데이터를 읽어오는 전통적 방식
System.out.println(arr4[i]);
}*/
//향상된 for문
for(int data : arr4){
System.out.println(data);
}
}
}
+) 문자와 문자열 확인
int[] arr1={10,20,30};
char[] arr2 ={'a','b','c'};
for(char data:arr2){
System.out.println(data);
}
String[] arr3={"abc","bds","dge"};
for(String data2:arr3){
System.out.println(data2);
}
* ArrayEx05.java - 이차원 배열의 선언
public class ArrayEx05 {
public static void main(String[] args) {
//다차원 배열
//이차원 배열
int[][] arr1;
arr1 = new int[3][2];
arr1[0][1]=10;
arr1[0][2]=20;
arr1[1][1]=30;
arr1[1][2]=40;
arr1[2][1]=50;
arr1[2][2]=60;
System.out.println(arr1[0][0]);
System.out.println(arr1[2][1]);
int[][] arr2 = new int[3][2];
int[][] arr3 = new int[][]{{10,20},{30,40},{50,60}};
int[][] arr4 = {{10,20},{30,40},{50,60}};
}
}
+) 이차원 배열과 향상된 for문 적용
public class Ex5_8 {
public static void main(String[] args) {
int[][]score={
{100,100,100},
{20,20,20},
{30,30,30},
{40,40,40}
};
int sum=0;
/* for(int i=0;i<score.length;i++){
for(int j=0;j<score[i].length;j++){
System.out.printf("score[%d][%d]=%d%n",i,j,score[i][j]);
sum+=score[i][j];
}
}
System.out.println("sum="+sum);
*/
//향상된 for문 //추가 이해 필요
for(int[] cols : score){
for(int data2: cols){
System.out.println(data2);
sum+=data2;
}
}
System.out.println("sum="+sum);
}
}
+) 2차원 배열을 통한 성적 계산
public class Ex5_9 {
public static void main(String[] args) {
int[][] score ={
{100,100,100},
{20,20,20},
{30,30,30},
{40,40,40},
{50,50,50}
};
int korToral= 0, engTotal=0, mathTotal=0;
System.out.println("번호 국어 영어 수학 총점 평균");
System.out.println("================================");
for(int i=0;i<score.length;i++){
int sum =0;
float avg =0.0f;
korToral += score[i][0];
engTotal += score[i][1];
mathTotal += score[i][2];
System.out.printf("%3d",i+1);
for(int j=0;j<score[i].length;j++){
sum+= score[i][j];
System.out.printf("%5d",score[i][j]);
}
avg=sum/(float)score[i].length;
System.out.printf("%5d %5.1f%n", sum,avg);
}
System.out.println("================================");
System.out.printf("총점:%3d %4d %4d%n", korToral,engTotal,mathTotal);
}
}
+) 3차원 배열 출력
//3차원 배열을 선언하고 출력
int[][][] arr=new int[3][][];
arr[0]= new int[][]{{10,20,30},{40,50},{60}};
arr[1]= new int[][]{{70,80,90},{100,110},{120}};
arr[2]= new int[][]{{130,140,150},{160,170},{180}};
System.out.println(arr[2][0][1]);
* ArrayEx08.java - args배열의 길이로 입력한 만큼 다시 출력
public class ArrayEx08 {
public static void main(String[] args) {
//배열의 길이
System.out.println(args.length);
//자료형:String
//System.out.println(args[0]);
//입력한 모든 값을 가져오고 싶을 때
//전체 파라메터(아규먼트)
for(int i=0;i<args.length;i++){
System.out.println(args[i]);
}
}
}
* ArrayEx10.java - 피연산자와 연산자 입력 시 해당 값을 계산해주는 프로그램 (계산기)
public class ArrayEx10 {
public static void main(String[] args) {
// 숫자 연산자 숫자 => 연산결과 출력되는 프로그램
if(args.length!=3){
System.out.println("입력이 잘못되었습니다");
}else {
int num1 = Integer.parseInt(args[0]);
int num2 = Integer.parseInt(args[2]);
int result =0;
switch(args[1]){ //계산부
case "+":
result=num1+num2;
break;
case "-":
result=num1-num2;
break;
case "x":
result=num1*num2;
break;
case "/":
result=num1/num2;
break;
}
//출력부
System.out.println(num1+" "+args[1]+" "+num2+" = "+result);
}
}
}
* ArrayEx11.java - 10개의 숫자 입력 후 해당 숫자의 최대값과 최소값 찾기
public class ArrayEx11 {
public static void main(String[] args) {
//10개의 수를 입력받아서 최대값과 최소값을 출력하는 프로그램
if(args.length!=10){
System.out.println("입력이 잘못되었습니다");
}else {
int min= Integer.parseInt(args[0]);
int max=Integer.parseInt(args[0]);
for(int i=0;i<args.length;i++){
if(min>=Integer.parseInt(args[i])){
min=Integer.parseInt(args[i]);
}
}
for(int i=0;i<args.length;i++){
if(max<=Integer.parseInt(args[i])){
max=Integer.parseInt(args[i]);
}
}
System.out.println("최소값: "+ min);
System.out.println("최대값: "+ max);
}
}
}
순차처리 프로그래밍
(위->아래)
구조적 프로그래밍
-함수
[ 객체지향 (중심) 프로그래밍 (Object Oriented(중심) Programming) ]
- 공통적 내용을 추출한 정의
객체 모델링(Object Modeling) -기획의 자료
UML(Unified Modeling Lang)
* UML
- class diagram
- use case diagram (기능)
- sequence diagram(함수호출)
클래스 (class)
!!!소스파일의 이름은 class의 이름과 동일해야한다!!!
사용자 정의 클래스 - 문법
라이브러리 / API
내장 클래스 - 사용법
외부 클래스
class 클래스명 {
멤버필드;
메서드;
}
클래스명
- 식별자 규칙
- 대문자로 시작
학생관리 프로그램
이름 번호 나이 키 몸무게
홍길동 1001 20 180 80
손수빈 1002 23 163 55
학생
이름
번호
나이
키
몸무게
클래스 선언
class Student {
String name;
String number;
int age;
double height;
double weight;
}
# 클래스의 인스턴스화
- 클래스로부터 객체를 만드는 과정
* MethodEx01.java - 클래스/메서드 선언 + 인스턴스 생성
class Method{ //클래스를 먼저 선언
//메서드의 선언
void doFunc1(){
//지역변수
//제어문
//실행문
System.out.println("doFunc1() 호출"); //메서드를 사용하려면 클래스 안에 담아야함
}
void doFunc2(int data1){
System.out.println("doFunc2() 호출: "+ data1);
}
// 리턴이 없으면 void
void doFunc3(int data1, int data2){
//지역변수 - 초기화 후 사용
int num=1;
System.out.println("doFunc3() 호출: "+ data1+data2);
System.out.println("doFunc3() 호출: "+ num);
}
//리턴에 대한 자료형
int doFunc4(int data1, int data2){
int sum = data1+data2;
return sum;
}
}
public class MethodEx01 {
public static void main(String[] args) {
Method m1=new Method(); //인스턴스 생성
m1.doFunc1();
m1.doFunc2(10);
int sum = m1.doFunc4(100, 200);
System.out.println("출력결과: "+sum);
Method m2=new Method();
m2.doFunc1();
m2.doFunc3(30, 15);
}
}
* MethodEx02.java - 최대값 찾기
class Util{ //클래스를 먼저 선언
int viewMaxNumber(int data1,int data2, int data3){
int max=data1;
if(data1>=data2&&data1>=data3){
max=data1;
}else if(data2>=data1&&data2>=data3){
max=data2;
}else if(data3>=data1&&data3>=data2){
max=data3;
}
return max;
}
}
public class MethodEx02 {
public static void main(String[] args) {
Util max1=new Util();
int max= max1.viewMaxNumber(20, 20, 40);
System.out.println(max);
}
}
* StudentMain01.java - 참조변수 선언과 생성
//class 선언
class Student {
String name;
String number;
int age;
double height;
double weight;
}
public class StudentMain01{
public static void main(String[] args) {
//참조변수 선언
Student stu1;
//참조변수 생성
stu1 = new Student(); //인스턴스
//초기화->멤버필드 초기화
stu1.name="홍길동";
stu1.number="1001";
stu1.age=20;
stu1.height=180;
stu1.weight=80;
//초기화 시킨 멤버필드를 출력
System.out.println(stu1.name);
System.out.println(stu1.number);
System.out.println(stu1.age);
System.out.println(stu1.height);
System.out.println(stu1.weight);
//stu2인스턴스 생성
Student stu2= new Student();
stu2.name="손수빈";
stu2.number="1002";
stu2.age=23;
stu2.height=163;
stu2.weight=55;
System.out.println(stu2.name);
System.out.println(stu2.number);
System.out.println(stu2.age);
System.out.println(stu2.height);
System.out.println(stu2.weight);
System.out.println(stu1); //참조값 확인
System.out.println(stu2);
}
}
* OverloadEx01.java - 오버로딩
class Overload{ //오버로딩의 조건을 나열
//오버로딩 - 이름이 같아도 매개변수가 다르면 서로 구별될 수 있는 것
//1. 메서드 이름이 같아야 함
//2. 매개변수의 개수 또는 타입이 달라야 함
//3. 반환 타입은 관계없음
void doFunc(){
System.out.println("doFunc() 호출1");
}
void doFunc(int a){
System.out.println("doFunc(int a) 호출");
}
void doFunc(String s){
System.out.println("doFunc(String s) 호출");
}
void doFunc(String s, int a){
System.out.println("doFunc(String s, int a) 호출");
}
void doFunc(int a, String s){
System.out.println("doFunc(int a, String s) 호출");
}
}
public class OverloadEx01{
public static void main(String[] args){
Overload ol= new Overload();
ol.doFunc();
ol.doFunc(0);
ol.doFunc("string");
ol.doFunc("string",50);
ol.doFunc(70,"string2");
}
}
+) 실제 오버로딩이 쓰여지고 있음을 확인 (오라클 문서)
출처:https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html
* MethodEx03.java - 가변인자
class Util{
void doGugudan(String ... args){
System.out.println(" ");
for(int i=0;i<args.length;i++){
System.out.println(" ");
for(int j=1;j<=9;j++){
System.out.println(Integer.parseInt(args[i])+"x"+j+"="+ Integer.parseInt(args[i])*j);
}
}
}
}
public class MethodEx03 {
public static void main(String[] args){
Util u = new Util();
u.doGugudan("1");
u.doGugudan("1","2");
u.doGugudan("1","3","5");
}
}
/*다른방법
Class Util{
void doGugudan(int ... dans){
for(int dan : dans) {
for(int i=1; i<=9;i++){
System.out.printf("%2d x%2d =%3d\t", dan ,i,(dan*i));
}
System.out.println();
}
}
}
*/
* Exercise6_2.java - 학생 클래스 만들고 점수 합계와 평균 계산
//class 선언
class Student{
String name; //학생이름
int ban; //반
int no; //번호
int kor; //국어점수
int eng; //영어점수
int math; //수학점수
Student(String name, int ban, int no, int kor, int eng, int math){
this.name=name;
this.ban=ban;
this.no=no;
this.kor=kor;
this.eng=eng;
this.math=math;
}
int getTotal(){
return kor+eng+math;
}
float getAverage(){
return (int)(getTotal()/3f*10+0.5f)/10f;
}
String info(){
// double sum= kor+eng+math;
// double avg=sum/3;
String str=name+","+ban+","+no+","+kor+","+eng+","+math+","+getTotal()+","+getAverage();
return str;
}
}
public class Exercise6_2{
public static void main(String[] args) {
Student s = new Student("홍길동", 1, 1, 100, 60,76);
String str =s.info();
System.out.println(str);
}
}
+) 다르게 표현하기
public class Exercise6_3{
public static void main(String[] args) {
Student s = new Student();
s.name ="홍길동";
s.ban=1;
s.no=1;
s.kor=100;
s.eng=60;
s.math=76;
System.out.println("이름: "+s.name);
System.out.println("총점: "+s.getTotal());
System.out.printf("평균: "+s.getAverage());
}
}
class Student{
String name; //학생이름
int ban; //반
int no; //번호
int kor; //국어점수
int eng; //영어점수
int math; //수학점수
int getTotal(){
int sum= kor+eng+math;
return sum;
}
float getAverage(){
return (int)(getTotal()/3f*10+0.5f)/10f;
}
}
=> 향상된 for문에 대한 추가적인 공부 필요 (각 인자에 대한 내용 이해 부족)
=> Exercise6_2.java (해결완료)
문제상황: 숫자 계산에서 double형을 다시 intger로 바꾸고 싶었는데 해당 부분에서 오류가 생겼다.
- Integer.parseInt 써봄
- int로 계산하고 Double.parseDouble사용해서 바꿔봐도 나오지 않음 (해결하기) ==> 수정 완료
해결방법: float형으로 소수점 출력을 한자리만 나올 수 있도록 하였다.