/*
* 자바문법의 기초 : 자바의 소스파일명과 클래스명은 대소문자까지 같아야 합니다.
* 또한 클래스 내부에 모든 코드가 들어가야 합니다.
* 즉 모든 실행 명령은 클래스바디{} 내에 위치해야 합니다
* 코딩을 함과 동시에 컴파일이 이뤄지며, 클래스 파일이 생성되는데, 항상 문법적인 부분을 조심하세요
*
* 컴파일러는 문법에서 오류가 발생하면, 오류 내용과 함께 위치를 알려줍니다.
*
* 여러분은 그 부분을 확인해서 디버그를 해서 문법적 오류가 없는 코드를 작성해야 합니다.
*
* 중요!! 실행 가능한 클래스 파일은 하나부터 수천개까지 정의할 수 있습니다.
* 이때, 처음 시작하는 시작점이 있는데, 여러분이 실행 명령을 내리면 , 클래스가 Java VM 의 메모리에 로드가 되고
* VM이 실행되는앱의 시작점을 자동으로 찾아서 호출 하는데, 그게 main 메서드 입니다.
*
* 이 메서드는 수천개의 클래스가 있어도, 반드시 하나만 존재 해야하며, 이 메서드를 갖는클래스가 메인 클랙스가 되어야 합니다.
*
* 꼭 기억 때문에, 이 메인 메서드는 반드시 아래와 같은 형식을 가져야 합니다.
*
* public static void main(String[] a[rgs]){
* main 메서드 body..
* }
*/
public class DataTypeEx {//class body
/*
* 자바의 데이터 타입(type) : 크게 2개로 구분할 수 있으며, 다시 세분화되어 구분되어집니다.
*
* 크게는 객체 타입(Reference type 일명 R 타입)과, 원시형(Primitive type 일명 p type)으로 구분되어 집니다
*
* 객체와 비객체로 나눠짐
*
* 객체타입은 나중에 배움 먼저 p 타입
*
* 데이터 타입이란 변수 또는 변수가 없는 메모리, 즉 실제 값을 담는 영역인 메모리에 어떤 타입과 크기의 값이 들어가느냐에
* 따라서 결정을 짓는것을 말합니다
*
*
* 꼭 기억 : 자바에서는 변수가 처음 선언되어질때 반드시 왼쪽에 변수가 담을 값에 타입과 범위를 감안해서
* 적절한 타입을 지정해야 한다
* 그렇지 않으면 에러임
*
* 또한 해당 타입은 메모리에서 사라질때까지 절대 변경 되지 않음 매우중요!!!
*
* 자바는 데이터타입에 매우 엄격하기 떄문에, 위 두조건중 하나라도 만족되지 않으면 바로 에어를 유발 하거나, 실행시에
* 예외(Exception)을 발생시킵니다
*
* p type 은 아래처럼 구분되어짐
*
* 1.수치형 (괄호내의 값은담을 수 있는 크ㅅ기를 나타냄)
* a. 정수형 : byte(1byte), short(2byte) , int(4byte, default) , long(8byte)
*
* 2. 문자형(유니코드를 기반으로 하는 정수타입입니다.) 음수가 없는 양수로만 구성되어 잇고ㅡ char 라는 타입으로 지정 됩니다.
* 크기는 대락(0~65,500) 까지로 담습니다
*
* 3.boolean : 자바스크립트와는 틀리게 오직 true /false 만 담을 수 있음
*
* !!!! 문자열은 객체(Rtype) 으로 처리되어집니다. ""을 이용해서 리터럴로 사용가능합니다
*
* 리터럴형은 데이터 타입을 선언하지 않고 사용되는 데이터 그 자체를 말합니다.
* ex> 2 + 3 = 2 와 3은 변수에 담지 않았지만 내부적으로는 int 로 처리 되어집니다. 2,3을 리터럴 데이터라고 함
*/
public static void main(String[] args) {
/*
* 데이터 타입 실행전에, 변수의 특징부터 알아봅시다.
* 변수는 선언, 대입, 초기화 스크립트와 같습니다.
* 단 틀린점은, 값이 초기화 되기전에 사용되면 무조건 에러입니다.(undefined 이런거 없음)
*/
byte b1;//byte 타입의 b1 선언함 메인 메서드의 지역 변수
byte b2,b3;//한 라인에 같은 타입의 변수를 , 를 기준으로 연속 선언 가능함
byte b4 = 10; //b4 초기화
//값 초기화 이전에 사용시 에러 보기
//System.out.println(b1);
//올바른 사용예
System.out.println(b4);
b2 = -10;
System.out.println(b2);
//b3 = 1.0;
//byte -128 ~ 127 의 정수를 담는 타입인데, 범위가 너무 작지않나?
//나중에 배우겟지만 byte 는 정수를 연산하는데 사용하는 목적이 아닙니다
//내부적으로 문자를 처리하기 위한 용도의 목적이다
//간단한 예를 들자면, 여러분이 카카오톡 채팅을 할 떄 화면에 ㄴ한글로 표기되지만
//전송을 누르는 순간, 프로그램에서는 모두 byte 로 변환되어서 네트워크를 타고
//상대편에 전달된후 다시 문자열로 원복되는 과정을 거침
//short 는 죽은 데이터 타입입니다(안 쓰임)
//int 정수형의 기본 데이터 타입입니다
//사용목적으로는 연산 및 문자 등을 표현할 때 사용합니다
//우리 자바스크립트 시가넹 문자셋 했던 거 기억?
//그떄 유니코드 (UTF8) 은 전세계 문자셋을 정수 테이블로 관리한다고 했는데
//int 역시 정수연산과 다국어 문자 표기를 호환하기 위해 존재한다.
//default 타입이란, 타입선언 없이 값을 사용시에, 그 값을 판단하여 적절한 메모리를 만들어서 사용하는 것을 말합니다
//ex> 2+3 --> int 메모리 생성, 값 2 초기화 + int 메모리 생성, 값 3 초기화 이후 + 연산 및 결과 반환
//연산 및 결과 타입 : 자바에서는 정수만 기준으로 설명하면, 리터럴 + 리터럴을 처리할 때, 내부적으로는
//int 메모리 2개를 만들고 값 대입후 연산, 그리고 값이 담긴 타입을 리턴시킴 즉 int 가 리턴이 됨
//기본타입이란 말은 위처럼, 만약 int 이하 타입끼리 연산이 될 경우에는 연산정에 무조건 타입을 먼저 보고
//둘다 int로 먼저 변경을 해서 (정확히는 int 메모리 두 개를 더 만들어서 기존값을 복사해서 넣고)
//그 int 두개를 연산후 int 로 되돌려 줌
public class OutPuyConsole {
public static void main(String[] args) {
//출력문 기능 몇가지 알아볼게요..print, println, printf(포맷출력)
//먼저 자바에서도 문자열 + 모든datatype 의 결과는 문자열임
String msg = "10";
msg = msg + 10;
System.out.println(msg); //1010문자열로 출력됨
//escape 문자 .. 역슬래쉬를 이용해서 표현 합니다.
System.out.println(msg + "\n" + "hi");//라인 개행
System.out.println(msg + "\n\t" + "hi");//라인 개행 후 tap 만큼 들여쓰기
System.out.println(msg + "\n\t" + "\"hi\"");//라인 개행 후 tap 만큼 들여쓰고 " "표시
System.out.println(msg + "\n\t" + "\'hi'");//라인 개행 후 tap 만큼 들여쓰고 ' '표시a
//println() 은 내용을 출력후 자동줄바꿈합니다
//print() 는 내용 출력 후 줄바꿈 하지 않고, 다음 내용을 이어서 계속 출력 합니다
Systehttp://m.out.print("Hello");
System.out.println("World");
//jdk 1.5부터 지원된 c, c++ 의 포맷 출력 printf("포맷지사자 n1,n2,,,n", value,v2 ...n 갯수가 같은 수의 vlaue )
//각 지시자는 % 키워드를 이용해서 표시합니다
//지시자 키워드는 n(뉴라인), 0 : 자릿수 지정시 공백을 0 으로 재움, - 전체 자릿수가 지정된 경우 좌정ㅇ여 후 출력
//.m : 소수점 아래 자리수 지정 표식자.. 잘리는 소수점 자릿수는 반올림됨..
//아래는 값을 지정하는 표식자(값은 데이터 타입에 종속적이기 때문에, 타입의 키워드만 알면 쉬움)
/*
* %b : boolean 형식으로 출력(이후 % 생략)
* d(disimal) : 십진수, o : 8진수, x : 16진수
* f : 실수 표현
* c : 문자 하나 표현 (char) //자바는 문자열과 문자는 완전 다른 타입(String(R trpe), char(p type))
* s : 문자열 표식자...
*
*/
int age = 31;
String name = "최주현";
//System.out.println();
Systehttp://m.out.printf("내 나이는 %d 고, 이름은 %s 입니다.%4 6789n", age,name); //오버로딩
double avg = 1.245678;
Systehttp://m.out.printf("소숫점출력 합니다... avg 값 : %f%n", avg);
Systehttp://m.out.printf("소숫점 출력 하는데 자릿수 지정 ... avg (소수 3자리 반올림) 값 : %.3f%n", age,name);
}
}
public class Fruit{
/*
* 첫 번째 퀴즈 : 여러분이 과수원을 한다 라고 가정하고 아래의 로직을 작성해서 결과를 도축
*
* 과수원에는 사과, 배, 오랜지 를 키우고 있음
*
* 하루동안 각각의 생산량은 14, 7, 14 입니다
*
* 그럼 하루동안 생산되는 총 과일의 수량과, 시간당 몇 개가 생산되는 지를 출력
*
* ex>총 생산량 : x개, 시간당 생산량 : x.x개
*
* 조건 :
* 1. 반드시 변수를 3개 이상 사용해야 함
* 2. 반드시 한번의 리터럴 데이터 사용
* 3. 반드시 한 번의 케스팅 사용
* 4. 평균값은 float 타입으로 처리
*
*
*/
public static void main(String[] args) {
int apple = 14;
int pear = 7;
int orange = 14;
float total = (float)((apple + pear + orange) / 24.0) ;
System.out.println(apple + pear + orange);
System.out.println(total);
/*
* int app, ora, pear, total;
* total = app +ora + pear;
*
* avg + (float)(total / 24.0);
* System.out.println("총 생산량 : " + total);
* System.out.println("시간당 생산량 : " + avg);
*/
//필요하다면 하나의 소스 파일에 하나이상의 클래스를 정의할 수 있습니다.
//단!!! main() 을 가지고 있는 클래스가 파이명이 되어야 학,
//클래스명앞에 있는 public 키워드는 오직 메인 클래스만 가져야 합니다
//클래스를 정의 하는 위치는 전혀 상관이 없습니다.
}
} import javax.swing.JOptionPane;
public class FindLetter {
public static void main(String[] args) {
/*
* 0~127 까지의 랜덤한 정수를 발생
* 이 수가 아스키코드의 어느 범위의 문자인지를 확인하는 코드
* 범위는 다음과 같음
*
* 숫자 이전의 문자, 숫자, 숫자와 영대문자 이전의 특문, 영대문자 와 영소문자 사이의 특문,
* 영소문자 이후의 특문
*
* 위 범위를 찾아내서 결과는 다음처럼
*
* ex>m 발생시 소문자 m 발생 / 발생시(만약 영문자 사이의 특문) 영문자 사이의 특문"/" 발생
*/
char a = (char)(Math.random()*128);
if(a < '0') {
System.out.println("숫자 이전의 특문 :" + a);
}else if(a >= '0' && a <='9'){
System.out.println("숫자 문자 :" + a);
}else if(a > '9' && a < 'A') {
System.out.println("숫자와 영대문자 사이의 특문 :" + a);
}else if(a >= 'A' && a <= 'Z') {
System.out.println("영대문자 :" + a);
}else if(a > 'Z' && a < 'a') {
System.out.println("영문자 사이의 특문 :" + a);
}else if(a >= 'a' && a <= 'z') {
System.out.println("영소문자 :" + a);
}else if(a > 'z') {
System.out.println("영소문자 이후의 특문 :" + a);
}
if(Character.isDigit(a)) {
System.out.println("숫자문자 발생" + a);
}else if(Character.isUpperCase(a)) {
System.out.println("영대문자 발생" + a);
}else if(Character.isLowerCase(a)) {
System.out.println("영소문자 발생" + a);
}else {
System.out.println("특문 발생" + a);
}
//System.out.println("숫자 이전의 특문" + "\" + a + "\" + "발생함");
//자바프로그램을 명시적으로 완전히 종료하는 API
//자바 Process 가 완전히 종료
System.exit(0); //비정상 종료시엔 -1 을 대입하지만,, 대부분 0을 씀
/*
* Java Array : 배열은 객체입니다. 그러나, 속성 딱 하나만 존재합니다.
* 속성은 length 이며, 배열의 길이를 리턴합니다.
* 배열의 목적은 하나 이상의 값을 하나의 변수에 할당해서 관리하는데 잇음
* 이렇지 않을 경우엔 값마다 변수를 모두 지정해야 하느데 그게 힘들어서 배열이 나온거임
*
* 1.자바 배열은 객체이다,, 즉 배열을 생성하면 heap 메모리 영역 (모든 instance 가 생성되는 동적 영역)에 instance 가 생성되며
* VM은 생성된 instance 의 Reference 를 무조건 return 한다
*
* 프로그래머는 목적에 따라서 리턴된 Ref 를 변수에 담아서 계속 사용하는 것임
*
* 해서, 이 변수를 우리는 객체라고 부르게 된 것임
*
* 2.자바는 타입이 매우 엄격하기 때문에 , 배열을 생성시엔 타입이 명시되어야 하고 값도 해당 타입이거나 하위 타입이어야 함
* 만약 하위 타입이 값으로 들어가면 들어가는 순가 ㄴ배열 타입으로 변경됨
*
* 3. 자바 배열은 객체이기 떄문에 P or R 타입 모두를 값으로 갖는 배열을 생성할 수 잇음
* 이 말은 특정 타입을 객체로 배열의 요소(값)으로 담을 수 있다는 뜻임 당연히 타입은 해당 값의 클래스로 선언 되어야 함
*
* 4. 배열의 값을 주지 않고 길이만 주고 생성할 수 잇고, 이럴경우 무조건 해당 타입의 default 값으로 초기화 되어짐
*
* 5. 배열의 길이를 주지 않고 생성 될 수 없음
*
* 6. 배열은 초기값을 주고 생성될 수 있음
*
* 7. 배열의 크기는 인위적으로 변경 불가능 변경하고 싶으면 새로 생성해야함
*/
import java.util.Arrays;
public class ArrayEx {
public static void main(String[] args) {
System.out.println(args[0] + args[1]);
//배열의 문법
//1.크기만 주고 생성하기
int[] inArr = new int[5];//5개의 배열생성됨.
boolean boArr[] = new boolean[3];
System.out.println(inArr);//배열객체를 출력문에ㅐ 넣으면 HashCode 리턴
//(생성된 instance 의 16진수로 된 메모리 값 @ 를 기준으로
//앞은 인스턴스의 타입을 뒤는 메모리 주소의 HashCode 룰 나타냅니다)
//배열의 값이 뭔지를 문자열로만 확인 할 떄는 Array class 의 toString()을 이용하면 됩니다
System.out.println(Arrays.toString(inArr));
System.out.println(Arrays.toString(boArr));
}
}
/*
* 메서드 오버로딩 : 결론만 말하자면 메서드를 호출할 때 같은 이름의 메서드가 여럿 존재시
* 메서드의 시그니처 를 보고 VM 동적으로 호출하느 ㄴ개념
*
* 이렇게 하는 이유는 전에도 말햇듯이 전체적으로 보면 같은 기능을 하는 메서드 인데 Detail 이 조금씩 틀린 경우
* 메서드 이름을 다르게 하려면 이름짓기도 힘들고 , 자칫 이름을 잘못 해석해서 사용을 잘못하게 하는 것을 방치하기 위함
*
* 이렇듯 이름이 같은 메서드를 시그니처만 틀리게 하여 정의 하는 것을 메서드 오버로딩이라 한다
*
* 이 논리는 생성자에서도 사용됨 기억하셈
*
* //void 안에 있는 클래스 넣으면 안댐
*
* 시그니처
* 1. 메서드 이름은 무조건 같아야 함/리턴타입 또한 같아야함
* 2. 메서드 args 의 타입 순서 갯수 를 시그니처라고 함
* 3. 위 시그니처 중 하나라도 틀리면 오버로딩 가능
* 4. 한 클래스에서는 시그니쳐가 같은 메서드는 하나이상 재선언 불가능
*/
public class MethodOverloading {
public static void main(String[] args) {
//범위내의 랜덤 얻어내기
int r = getRandom.postRandom(10, 20);
System.out.println(r);
System.out.println(getRandom.postRandom(10, 20)); //void 안에 있는 클래스 넣으면 안댐
}
}
/*
*메서드 호출시에 전달되는 파라미터의 특징에 대한 내용(Call By Value & Call By Reference)
*
* 메서드 호출시에 전달되는 파라미터의 타입에 따라서 위 두 개중의 하나가 실행 됩니다.
*
* 이중 CallByValue 는 오직 Ptype 인 경우만 발생, Rtype 은 CBR로 무조건 진행됨
*
* CallByValue 란 p 타입의 데이터가 파라미터로 전달될 떄는 중간에 VM 이 전달하려는 파라미터를 복사하고 그 복사된 값을 호출되는
* 메서드에 파라미터로 전달한다는 것
*
* 이말은 즉 메서드에서 전달된 값은 어느쪽에서 변경을 하던 말던 전혀 별개로 취급되어진다는 뜻(영향미치지 못함)
*
* CBR은 반대임
*/
public class Method_CallByValue_Exam {
public static void main(String[] args) {
int a = 1;
System.out.println("doSome(int a ) 호출후 main 의 a 값 : " + a);
}
static void doSome(int a) {
a += 100;
System.out.println("호출된 메서드에서의 a 값 : " + a);
}
}
/*
* Java Method : 자바에서 method 는 매우 중요함
*
* 1.메서드의 정의 형태 : 메서드는 클래스 내부애ㅔ 정의하느 기능을 담당하는 주체
* 미 메서드는 겅계목적에 따라 static, none-static 으로 정의
*
* 메서드를 정의하는 목적은, 객체지향에서는 모든 프로그램이 진행될때, 각각의 목적 또는 대상을 클래스로 설계후 객체를 생성해서
* 그 객체의 메서드를 통해 특정 기능을 수행하면서, 프로그램의 연산, 연산 후 결과 등을 되돌리거나(return) 되돌리지 않거나(void)
* 하도록 하는 것
*
* 때문에 메서드는 특정 클래스가 어떤일을 할 지를 결정해서 그 구현을 매서드로 정의 필요시에 호출을 통해
* 그 기능을 사용 또는 재사용하는 목적
*
* static 으로 선언된 메서드는 객체 생성없이 사용 할 수 있다는 게 특징
*
* 이러한 특징 떄문에 같은 클래스 내에서 정의된 static 키워드가 붙은 애들끼리만 호출가능
*
* 메서드 문법 : [접근제어자(Access Modifier ) (public, protected, default(pakage), private] [static] return type
* name([args], type name, type name, type name...n개의 type name){
* method body define
*
* 위에서 만약 args 를 선언하면 해당 args 는 이 메서드 내부에서느 ㄴ지역 변수로 인식
* 떄문에 메서드가 종료되면 해당 변수도 사라짐 같은 이름의 다른 메서드에서도 사용 가능
*
* 메서드의 리턴타입에는 P or R 로 구분 되어지는데, R 타입인 경우엔 객체를 리턴하겠다는 의미로, 그 객체의 원형(prototype)인
* 클래스 또는 상속을 해준 부모클래스 or 인터페이스를 선언
*
* p 타입을 리턴할 경우앤, 정확한 타입을 명기함 정수인 경우엔 정수타입종류, 실수는 실수타입, 불린 OR char 등...
* 단 리턴하는 값보다 큰 타입으로 선언 가능 하지만 작은 타입으로는 선언 불가능(Promotion 생각)
* [return or return value](꼭 기억 리턴 타입이 void 아닌 경우엔 반드시 선언된 타임의 value 를 리턴)
* }
*
*/
import javax.swing.JOptionPane;
public class MethodExam {
//자바에서는 전역 변수란 개념은 없고, 같은 의미 및 더 추가 개념으로 공유변수라는 개념 사용
//이 공유변수는 소속이 객체가 아닌 클래슥가 가지고 있게 되면 공유변수개념이 댐
//이 클래스가 가지고 있는 변수(즉 클래스 변수)를 static 변수라고 함
static boolean goGame = false;
public static void main(String[] args) {
sayMessage();
String input = JOptionPane.showInputDialog("y/n 입력해");
int res = startGame(input);
System.out.println(res);
int r = getRandom.postRandom();
int doSome = (int)r;
while(goGame) {
System.out.println("게임이 시작되었습니다." );
return;
//위 goGame 이 true 라면 게임시작.
}
static doSome(int r) {
}
System.out.println("잘못된 입력 이거나 게임을 원치 않기에 프로그램을 종료함");
System.exit(0);
}
static void sayMessage() {
JOptionPane.showMessageDialog(null, "게임월드에 오신 걸 환영합니다");
// System.out.println("안녕하세요. 게임 월드에 오신 걸 환영합니다.");
}
//게임시작을 원하는 지 여부를 판단, 입력값의 결과를 되돌려 주는 메서드 정의함.
static int startGame(String input) {
//int result = -1;//-1(틀린 키워드),0(go game),1(no game)
switch (input) {
case "y":
goGame = true;
return 0;
case "n":
return 1;
}
return -1;
}
}
/*
* 자바 다차원 배열 : 모든 프로그램에서는 다차원 배열을 지원 합니다.
* 자바도 마찬가지임. 다차원 배열이란, 배열 내부에 다시 베열을 넣은 것을 말합니다.
* 이럴때, 실제 Date(값) 은 내부배열(inner array) 에 존재하게 됨
* 다차원 배열을 연상할 떄, 외부 배열은 Outer, 내부는 inner
*
* 이렇듯 다차원 배열은 배열 내부에 배열이 존재하는 것이기 떄문에, Outer 의 각 index 에는 배열이 다시 할당되어짐
*
* 이 말은 Outer 의 길이 (length) 외에 outer 의 각 index 에는 다시 내부 배열의 길이를 리턴하는 length 가 존재 한다느 말
*
* 실제 값은 outer[0]inner[0](예시임) 에 존재하게 댐
*
*/
import javax.swing.JOptionPane;
public class MultiArrEx {
public static void main(String[] args) {
//이차원 배열의 생성문법 1. 배열의 크기만 주고 생성, 값은 타입의 default 값으로 초기화 되어짐
int[] multi1[] = new int[3][10];
//아파트의 동수를 출력
System.out.println(multi1.length);
//0동애는 몇가구가 살고 있을 까요??
System.out.println(multi1[0].length);
//0번쟤 동에 9번째(마지막) 가구수
System.out.println(multi1[0][9]);
//배열의 요소에 값 대입하기
multi1[0][9] = 100;
System.out.println(multi1[0][9]);
//배열의 초기화식 문법(전에도 강의 햇지만, 뭔가를 초가화 한다는 말은
//선언과 동시에 값을 할당, 즉 초기화 한다는 말
//배열 초기화란 배열을 생성하면서 default 값이 아닌 특정 값으로 초기화 한다는 말임
String[] apt[] = {{"효정","낙주","희정"},{"혜원","상원","요한"}};
System.out.println(apt[0][apt[0].length-1]);
//for 를 이용해서 모든 사람을 출력해보세요.(Tip,, 각 동에는 가구가 할당되어잇고, 그 길이를 리턴하는 length 속성이 존재)
for(int i = 0; i<apt.length; i++) {
for(int j=0; j < apt[i].length; j++) {
System.out.println(apt[i][j]);
}
}
//2번쨰 문법.. 위 1과 2를 합친문법
char[] theCh[] = new char[][] {{'A','B'},{'C','D'},{'E','F'}};
//for 를 이용해서 출력해보세요
for(int i = 0; i < theCh.length; i++) {
for(int j = 0,c = 'z'; j < theCh[i].length; j++,c--) {
System.out.println(theCh[i][j]);
//theCh[i][j] = (char)c;
}
}
//3명의 성적을 관리하는 프로그램을 배열로 작성해봅니다.
String[] sub = {"국어 점수 입력(0~100)","수학 점수 입력(0~100)","영어 점수 입력(1~100"};
//한 명당 받을 수 잇는 과목수는 위 sub 가 가지고 잇음 또한, 총점도 각 인원에 맞게 설정되어야 합니다
int[] scores[] = new int[3][4]; //3명에 4개의 점수(3개는 국영수 나머진 총점)를 담을 수 잇도록 다중 배열 생성
float[] avgs = new float[scores.length];
for(int i = 0; i < scores.length; i++) {//모든 사람의 점수를 입력받기 위해 사람 수 만큼 루프 시작
//이 영역은 각 사람의 영역으로 들어왔다는 말임..
for(int j = 0; j < sub.length; j++) { //scores[i].length -1 할 수도 잇음
//이 영역은 i 번 학생의 j 점수를 입력받는 영역
do {
scores[i][j] = Integer.parseInt(JOptionPane.showInputDialog(sub[j]));
} while(scores[i][j] > 100 || scores[i][j] < 0);
//여기로 코드가 온다는 의미는 한 과목의 입력 점수가 올바르다는 뜻.
scores[i][3] += scores[i][j];
}
//여기는 여전히 i 변수인 사람을 Ref 하는 영역임
//즉 코드가 여기로 온다는 말은 점수가 모두 올바르고 총점까지 누적되엇다는 말임
avgs[i] = (float)(scores[i][3] / 3.0); //이건 평균 코드
}
for(int i = 0; i < scores.length; i++) {
if(i == 0) {
System.out.println("첫 번째 총점 : " + scores[i][3] + "평균 :" + avgs[i]);
}else if(i == 1) {
System.out.println("두 번째 총점 : " + scores[i][3] + "평균 :" + avgs[i]);
}else if(i == 2) {
System.out.println("세 번째 총점 : " + scores[i][3] + "평균 :" + avgs[i]);
}
}
//동적가변 배열 : 배열을 동적으로 생성하는 것.
char[] stars[] = new char[10][];
for(int i= 0; i < stars.length; i++) {
stars[i] = new char[i+1]; //공백에 새로운 값 주기
for(int j= 0; j < stars[i].length; j++) {
stars[i][j] = '*';
Systehttp://m.out.print(stars[i][j]);
}
System.out.println();
}
/*
* Call by Reference : 메서드와 메서드간의 호출을 같이 넘겨지는 파라미터가 객체 타입인 경우
* 발생하는 특징을 정리
*
* 같은 객체 : 인스턴스를 참조하느 레퍼런스가 같은 객체
*/
import java.util.Arrays;
public class CallByReEx {
public static void main(String[] args) {
int[] arr = {1,2,3}; //String[] arr = null; 지금은 값이 없는 string 배열이지만 나중에 값이 할당될거야 라는 느낌
//arr = null;
b(arr);
System.out.println("b() 에서 수정 후 a() 애서의 arr 배열의 값 :" + Arrays.toString(arr));
//객체의 참조를 날려버리는 방법..
//모든 객체의 기본값인 null 을 대입하면 더 이상 Ref 하지 않음................
}
static void b(int[] pArr) {
System.out.println("파라미터로 받은 배열의 값 : " + Arrays.toString(pArr));
//pArr 의 값 수정함
pArr[0] = 1000;
System.out.println("수정 후 배열의 값(b()) : " + Arrays.toString(pArr)) ;
}
}
/*
* Java Class : 자바 객체지향(OOP - Object Oriented Programming )의 핵심
*
*
* 클랙스는 객체의 원형(Prototype) 이라고 칭하며, 실제 프로그램이 실행이 될떄, 그 목적을 담은 클래스를 정의 후
* 해당 클래스의 객체(instance)를 생성하며, 이를 이용하는게 객체지향 프로그램이다
*
* 때문에 객체는 그 원형인 클래스가 없이는 절대 생성이 불가하다는 의미로 생각
*
* 이런 목적으로 클래스를 정의 하는데 클래스를 바탕으로 객체가 되엇을 떄 각 객체는 객체간의 통신을 메서드로 통해서
* 하게 되며 주고 받는 데이터는 그 객체가 가지고 잇는 속성을 주고 받고 연산등을 통해 목적을 이루도록 합니다
*
* 해서 클래스에는 위 목적에 맞게 설계를 위한 2개를 기본적으로 정의 하는데 속성 메서드임
*
* 또한 클래스에는 실제 클레스를 바탕으로 인스턴스를 생성하게 해주는 역할을 하는 코드또한 넣을 수 있는데(optional)
* 이를 객체를 생성하는 메서드라고 해서 일명 생성자(constructor) 라고 부름
*
* 이 생성자가 반드시 존제해야만 클래스를 바탕으로 객체를 생성할 수 있슴니다.
*
* 생성자가 하는 역할은 이것외에 객체가 생성시 객체의 상태를 특정 상태로 초기화 하는 기능도 내포하고 잇음
*
* 다시 종합하면, 클래스는 객체의 바탕이며, 하나의 클래스를 바탕으로 원하는 만큼의 객체를 발생(instantiation)할 수 잇고
* 메서드를 통해 통신고ㅏ기능을 수행 하며 객체의 상태는 속성의 값으로 표현한다고 할 수 잇음
*
* 마지막으로 클래스를 정의 할 떄 위 내용을 기반으로 3개를 정의 (모두 옵션임 목적에 따라 할 수도 안 할 수도 잇음)
* 할 수 잇는데 그 종류는 아래와 같음
*
* 1. 객체의 속성을 나타내는 필드(fields) : 자바에서는 이를 객체의 속성 이라고 해서 member field 라고 함
* 2. 객체가 생성된 후 수행할 기능을 정의 한 메서드 ,, non-static 메서드여야 하며, 이를 member method 라고 함
* 3.객체를 생성하고 초기화 하는 기능을 가진 일종의 메서드인 생성자 : 반드시 클래스 이름과 같아야 하며 리턴타입이 존재하지 않음
*
* 일반적으로 클래스 정의 시 클래명 > 맴필 > 생성자 > 메서드 순으로 정의 됨
*/
public class ClassExam {
public static void main(String[] args) {
Avi6Student me = new Avi6Student();//Instantiation
System.out.println(me.name);//default 객체 : 필드값이 디폴트값으로 초기화 된 거 기본 객체
System.out.println(me.age);
//멤필에 대한 대입
me.name = "최주현";
me.age = 27;
me.addr = "서울";
Avi6Student hyojung = new Avi6Student();
}
}
}
}
}
}