코딩연습은? 여러 방식을 경험해보면서 차근차근 확장해 나간다. 기초부터 천천히 꾸준히 하면 된다.
첫 성적계산 코드는? 일차원적인 생각으로 첫 코드를 만들었다면, 앞으로 배우는 개념들을 통해 조금씩 수정해 나가보기로 했다.
리턴타입이 있는 경우, 대입연산자를 써서 반환되는 값을 담을 수 있다.
메소드 파라미터 자리에 또 다른 메소드 호출 가능하다(→ Param 확인)
- 단, 리턴 타입이 없는 void인 경우는 예외
package com.week1;
public class Print1 {
static int m() {return 5;}
static void n() {}
public static void main(String[] args) {
System.out.println(1);
System.out.println("안녕");
System.out.println(1.5);
System.out.println(true);
System.out.println(Print1.m()); //return타입이 있는 int 여서 출력 o
System.out.println("========");
// System.out.println(Print1.n()); //return타입이 없는 void여서 출력 x
}
}
/*
1
안녕
1.5
true
5
========
*/
package com.week1;
public class WReturn2 {
int i; // 전역변수 i
void methodA() { //리턴타입이 못오는 리턴타입 void를 사용
int i = 2; //지역변수
System.out.println("지역변수 i " + i);
}
int methodB() {
int i = 1; //지역변수 i
return i; //i=1
}
public static void main(String[] args) {
WReturn2 w=new WReturn2();
System.out.println("메인에서 methodB 호출 w.methodB()"+ w.methodB()); //메소드B는 리턴타입이 오는 리턴타입 int를 사용해서 메인에서 출력 가능
w.methodA(); //메소드A는 리턴타입이 못오는 리턴타입 void여서 해당 함수에서 출력을 남겨야 지역변수 출력 가능
System.out.println("클래스의 전역변수 호출 w.i "+w.i); // 전역변수 호출
}
}
/*
메인에서 methodB 호출 w.methodB()1
지역변수 i 2
클래스의 전역변수 호출 w.i 0
*/
package com.week1;
//코딩연습할 때 가능하다면 두 개 클래스를 준비해주세요.(등장인물 두 개 등장 -> 전변에 대해 깊게 이해하게 됨)
class Dog{
int leg = 4; //클래스 선언뒤 바로 입력 -> 전역변수
public void running() {
int leg = 6; //메소드 안에서 입력 -> 지역변수
System.out.println("running메소드를 인스턴스화하여 호출 = "+leg + "개"); //왜 출력이 안될까? 메인메소드에 running 함수를 불러오도록 인스턴스화 하여 실행!!
}
}
public class WVariable {
//16-17(인스턴스화 : 메모리에 로딩 중)-6-19
public static void main(String[] args) {
Dog myDog = new Dog();
//6을출력할 수 있다 -> 전역변수가 호출되었다!!
System.out.println("Dog 클래스를 인스턴스화하여 호출 =" + myDog.leg + "개");
//6을 출력할 수 있나요?
System.out.println("상수를 사용한 의미없는 호출 ="+6 + "개"); //상수를 출력하는 것은 의미x, 다른 방법 시도
//running 메소드는 어느 클래스에 선언되어 있는가?
//그렇다면 러닝메소드를 호출하여 실행하면 됨
myDog.running(); //6 출력 가능
}
}
/*콘솔값
Dog 클래스를 인스턴스화하여 호출 = 4개
상수를 사용한 의미없는 호출 = 6개
running메소드를 인스턴스화하여 호출 = 6개
*/
package com.week1;
//Account 클래스는 사용자에게 두 수(int)를 입력받아서
//두 수의 합을 구하는 메소드를 구현하기 위해 설계 + 파라미터를 보여주기 위해 지역변수를 사용
class Account{
int first; //이것은 전변이라서 초기화를 하지 않아도 0을 가지고 있다.
int second;
// int first, second; //이 값도 합법
//파라미터를 사용하지 않고 계산하기 위해서는 전역변수를 사용해야 함.
public void hap1() {
System.out.println("Account 객체, hap1 함수를 호출하여 나온 값은 = "+(first + second)); // 출력문장이 있어도 hap1 메소드를 호출하지 않으면 작동하지 x
}
//두 수를 파라미터로 받아서 계산하므로, 지역변수로 가능함.
//파라미터 자리에서는 초기화를 할 수 없음. 지역변수를 선언만 하는 자리이기 때문에!!
//지역변수는 반드시 초기화를 해야 함
//그럼 언제? 어디에서 가능할까요?
//파라미터 자리의 변수값은 호출될 때 결정되지만
//호출되는 메소드 안에서 다른 값으로 변경될 수 있다.(Call by value)
public void hap2(int first, int second) { //선언!! , 메인에서 first는 1, second는 3으로 올라왔지만, 15번에서 바꿔치기 함.
// int first로 못 쓰는 이유는? 위에서 이미 선언되었기에, 아래에선 초기화만 해야함. 두 번 선언x
System.out.println("Account 객체, hap2를 인스턴스화하고,여 아래에서 올라온 온전한 값은 = "+(first+second)); //4
first = 0; //재정의 되었다.
second = 1;
System.out.println("hap2 메소드 안에서 재정의 되어 바꿔치기 되어 나온 값은 = "+(first + second)); //런타임 에러
}
public void hap3() {
}
}//end of Account
public class AccountSimulation {
public static void main(String[] args) {
Account as = new Account();
as.hap2(0, 0); //4가 출력될까?? 놉
// as.hap2(); 오류 生, 메소드 호출할 때 반드시 파라미터 갯수나 타입 맞춰줘야 함.
// as.hap2(1, false); 오류 生, 메소드 호출할 때 반드시 파라미터 갯수나 타입 맞춰줘야 함.
as.hap1();
}
}
/*콘솔값
Account 객체, hap2를 인스턴스화하고,여 아래에서 올라온 온전한 값은 = 0
hap2 메소드 안에서 재정의 되어 바꿔치기 되어 나온 값은 = 1
Account 객체, hap1 함수를 호출하여 나온 값은 = 0
*/
부서번호 | 부서명 | 지역 |
---|---|---|
deptno | dname | loc |
10 | 개발부 | 서울 |
20 | 운영부 | 대전 |
30 | 기획부 | 제주 |
…n | …n | …n |
package com.week1;
class Dept1{ //이 클래스의 구성에대한 설명 & 한 번에 관계있는 이 내용을 참조형으로 불러오기 & 다른 클래스 생성시 틀로 사용
int deptno = 10;
String dname="개발부";
String loc="부산";
}
class Dept{ //이 클래스의 설명이라고 생각 & 다른 생성을 할 때는 틀이라고 생각
int deptno = 10;
String dname="개발부";
String loc="부산";
}
package com.week1;
//세로방향 연습
public class DeptSimulation {
public static void main(String[] args) {
Dept dept = new Dept(); // 선언
// Dept dept = new Dept(); 이건 왜? 이건 같은변수를 또 선언하는거여서 에러
dept = new Dept(); //재정의, new를 사용하여 인스턴스화를 하면 새로운 객체가 生
dept.deptno = 10;
System.out.println(dept);
System.out.println(dept.deptno);
dept = new Dept(); //재정의
dept.deptno = 20;
System.out.println(dept);
System.out.println(dept.deptno);
dept = new Dept(); //재정의
System.out.println(dept);
System.out.println(dept.deptno + " => 초기화 값이 없기 때문에 Dept의 기본값이 불러와짐");
}
}
/*
com.week1.Dept@4e50df2e
10
com.week1.Dept@1d81eb93
20
com.week1.Dept@7291c18f
10 => 초기화 값이 없기 때문에 Dept의 기본값이 불러와짐
*/
package com.week1;
//세로방향 연습, 이럴 때 반복되서 작업되는 것을 반복문을 통해 줄이는 것 가능
public class DeptSimulation {
public static void main(String[] args) {
Dept dept = new Dept(); // 선언
// Dept dept = new Dept(); 이건 왜? 이건 같은변수를 또 선언하는거여서 에러
dept = new Dept(); //재정의, 인스턴스화 할 때 마다 새로운 객체가 生
dept.deptno = 10;
dept.dname = "개발부";
dept.loc = "서울";
System.out.println(dept);
System.out.println(dept.deptno + " ,"+ dept.dname + " ," +dept.loc);
dept = new Dept(); //재정의
dept.deptno = 20;
dept.dname = "운영부";
dept.loc = "대전";
System.out.println(dept);
System.out.println(dept.deptno + " ,"+ dept.dname + " ," +dept.loc);
dept = new Dept(); //재정의
dept.deptno = 30;
dept.dname = "기획부";
dept.loc = "제주";
System.out.println(dept);
System.out.println(dept.deptno + " ,"+ dept.dname + " ," +dept.loc);
}
}
/*
com.week1.Dept@4e50df2e
10 ,개발부 ,서울
com.week1.Dept@1d81eb93
20 ,운영부 ,대전
com.week1.Dept@7291c18f
30 ,기획부 ,제주
*/
package com.week1;
public class Emp {
//사원번호를 담을 변수 선언
int empno = 0;
//사원이름, 업무 담을 변수 선언
String ename = null;
String job = null;
}
package com.week1;
//int 디폴트값이 0으로 약속된 것처럼 클래스의 디폴트값은 null로 되어있다.
public class EmpSimulation {
public void empPrint(Emp emp) { //?자리는 지역변수 자리, 호출될 때 결정된다
System.out.println("empPrint메소드로 나온 값은 ?? " + emp.empno +", " + emp.ename +", " +emp.job);
}
public static void main(String[] args) {
Emp emp = new Emp();
EmpSimulation es=new EmpSimulation(); //0, null, null
es.empPrint(emp); //파라미터 자리에 인스턴스 변수 참조
// System.out.println(emp.empno +", " + emp.ename +", " +emp.job);
emp = new Emp();
emp.empno = 7566; //재정의, 초기화
emp.ename = "나신입"; //재정의, 초기화
emp.job = "마케팅"; //재정의, 초기화
es.empPrint(emp); //파라미터 자리에 인스턴스 변수 참조
// System.out.println(emp.empno +", " + emp.ename +", " +emp.job); 이 방법 대신 위 메소드 활용
emp = new Emp();
emp.empno = 7499; //재정의, 초기화
emp.ename = "나초보"; //재정의, 초기화
emp.job = "매니저"; //재정의, 초기화
es.empPrint(emp); //파라미터 자리에 인스턴스 변수 참조
// System.out.println(emp.empno +", " + emp.ename +", " +emp.job); 이 방법 대신 위 메소드 활용
}
}
/*
empPrint메소드로 나온 값은 ?? 0, null, null
empPrint메소드로 나온 값은 ?? 7566, 나신입, 마케팅
empPrint메소드로 나온 값은 ?? 7499, 나초보, 매니저
*/
package com.week1;
public class EmpSimulation2 {
//main메소드에서 인스터스화 한 Emp의 주소번지(지역변수)를 setEmp 즉 다른 메소드에서 사용하려면
//메소드의 파라미터 자리를 이용하세요
void setEmp(Emp emp) { //null; -> emp = new Emp();
//insert here
emp = new Emp();
emp.empno = 7566; //변수값 재정의
emp.ename = "Smith";
emp.job = "영업";
System.out.println("============before============");
System.out.println(emp.empno +", " + emp.ename +", " +emp.job);
} //end of setEmp
public static void main(String[] args) {
EmpSimulation2 es2 = new EmpSimulation2();
Emp emp = new Emp(); //사원집합 클래스를 인스턴스화
es2.setEmp(emp); // 16번이 먼저실행 - > 10번줄이 먼저 호출 (값 : 0, null, null)
System.out.println("============after============");
System.out.println(emp.empno +", " + emp.ename +", " +emp.job);
}
}
/*
============before============
7566, Smith, 영업
============after============
0, null, null
*/
package com.week1;
public class EmpSimulation2 {
//main메소드에서 인스터스화 한 Emp의 주소번지(지역변수)를 setEmp 즉 다른 메소드에서 사용하려면
//메소드의 파라미터 자리를 이용하세요
void setEmp(Emp emp) { //null; -> emp = new Emp();
//insert here
// emp = new Emp();
emp.empno = 7566; //변수값 재정의
emp.ename = "Smith";
emp.job = "영업";
System.out.println("============before============");
System.out.println(emp.empno +", " + emp.ename +", " +emp.job);
} //end of setEmp
public static void main(String[] args) {
EmpSimulation2 es2 = new EmpSimulation2();
Emp emp = new Emp(); //사원집합 클래스를 인스턴스화
es2.setEmp(emp); // 16번이 먼저실행 - > 10번줄이 먼저 호출 (값 : 0, null, null)
System.out.println("============after============");
System.out.println(emp.empno +", " + emp.ename +", " +emp.job);
}
}
/*
============before============
7566, Smith, 영업
============after============
7566, Smith, 영업
*/
package com.week1;
public class Sungjuk {
String name = null; //학생이름
int scoreH; //html 점수
int scoreC; //css 점수
int scoreJ; //java 점수
int scoreSum; //score 합
}
package com.week1;
public class Cal {
void sungjukCalculator(Sungjuk sungjuk) { //성적을 계산해주는 메소드
System.out.println("이름 : " + (sungjuk.name) + " / 점수 합계 = " + (sungjuk.scoreH + sungjuk.scoreC + sungjuk.scoreJ) + "점" + " / 점수 평균 = " + (sungjuk.scoreH + sungjuk.scoreC + sungjuk.scoreJ)/3+ "점");
}
public static void main(String[] args) {
Sungjuk sungjuk = new Sungjuk(); //성적을 인스턴스화
Cal cal =new Cal(); //메소드를 인스턴스화
sungjuk = new Sungjuk(); //나신입을 생성, 초기화
sungjuk.name = "나신입";
sungjuk.scoreH = 75;
sungjuk.scoreC = 80;
sungjuk.scoreJ = 90;
cal.sungjukCalculator(sungjuk); //메소드 활용
sungjuk = new Sungjuk(); //나일등을 생성, 초기화
sungjuk.name = "나일등";
sungjuk.scoreH = 10;
sungjuk.scoreC = 20;
sungjuk.scoreJ = 30;
cal.sungjukCalculator(sungjuk); //홍길동을 생성, 초기화
sungjuk = new Sungjuk(); //메소드 활용
sungjuk.name = "홍길동";
sungjuk.scoreH = 20;
sungjuk.scoreC = 10;
sungjuk.scoreJ = 80;
cal.sungjukCalculator(sungjuk); //메소드 활용
}
}
/*
이름 : 나신입 / 점수 합계 = 245.0점 / 점수 평균 = 81점
이름 : 나일등 / 점수 합계 = 60.0점 / 점수 평균 = 20점
이름 : 홍길동 / 점수 합계 = 110.0점 / 점수 평균 = 36점
*/