- return
- 변수의 스코프(scope)
- 메소드의 재귀함수
- 클래스와 인스턴스 (객체) ★★★
- 오늘의 문제
return
return은 밑에값 호출x
public class Practice {
public static void main(String[] args) {
divide(9,1);
divide(0,9);
divide(9,0);
}
public static void divide(int num1, int num2) {
if(num2==0) {
System.out.println("0으로 나눌수없습니다.");
return;
}
System.out.println(num1/num2);
}
}
public class Hello {
public static void main(String[] args) {
int kor = 93;
int eng = 84;
int math =77;
int sum = kor+eng+math;
double avg = sum/3.0;
System.out.println(getGrade(avg));
}
public static char getGrade(double avg) {
if(avg<=90) {
return '수'; //이렇게 전부 return값을 줘도 가능
}else if(avg<=80) { //하지만 이렇게 return값을 남발하는 코드는 안좋은 코드!!!
return '우'; //현업에서는 이렇게 사용X
}else if(avg<=70) { //return은 종료를 의미하는데 이건 종료를 의미하는 코드X
return '미';
}else if(avg<=60) {
return '양';
}else {
return '가';
}
}
}
scope(범위)
-실무에서 단 한번도 쓰이지 않음.
-변수에대한 scope는 {중괄호}이다.
지역변수★
: {함수안에 있는 변수들}
지역변수가 아닌게 있다?
-함수바깥에, 클래스 안에 있는 변수. = 인스턴스변수,객체변수
-인스턴스변수의 범위는 그 클래스 전체.
메소드의 재귀 호출
재귀함수 : 함수안에 자기자신 호출
!(팩토리얼)
5! = 5 * 4!
4! = 4 * 3!
3! = 3 * 2!
public class Practice {
public static void main(String[] args) {
System.out.println("3! : "+factorial(3));
System.out.println("12! : "+factorial(12));
}
public static int factorial(int n) {
if(n == 1)
return 1;
else
return n*factorial(n-1);
}
}
→알고리즘은 재귀함수를 굳이 쓰지않아도 풀리기 때문에 실무에서 그닥 쓰이진않는다.
클래스와 인스턴스 (객체) ★★★
객체지향 프로그램 OOP(Object Oriented Programming)의 대표 java
클래스란?
변수와 함수. 두가지 기능을 갖고있는 것.
클래스와 객체의 차이
2가지.
클래스-설계도,메소드 정의
객체-
인스턴스-그 설계도에 따라서 만들어진 구체적인 제품, 메소드 호출
참조형(레퍼런스)-뭘참조한다는걸까?
크기 용도
예제를 통해 자세한 설명
package java_rec;
public class Circle { //Circle.java임
double radius; //1.변수(데이터) 결정 - Alt+Shift+S
public double getRadius(){ //2.get함수 생성
return radius; //3.그대로 불러오기
}
public void setRadius(double radius){
this.radius = radius;
}
public double getArea() { //넓이구해주는 함수
return radius*radius*Math.PI;
}
}
package java_rec;
public class CirMain {
public static void main(String[] args) {
Circle cir; //int a;랑 같은것. 이건 참조형! Circle(클래스명) 첫글자는 대문자써주기
cir = new Circle(); //new:객체생성 키워드임.(인스턴스)
//엇!()는 함수!-생성자 함수. 써먹는함수일까 만든함수일까-써먹는거!
//써먹으려면 메모리로 올려줘야하는데 "올리라고 하는 함수"가 바로 "new"임
//get,set,getArea 함수 넣어주기 (double이니까 각 8byte)
//참조형함수의 메모리는 4byte. 주소를 잡으려고하니까 주소한방에 보내려고 (자바 기본 메모리).
//Circle cir = new Circle(); 로 바로 사용가능.
//Circle cir1~무한대=new Circle(); ---붕어빵틀.
cir.setRadius(10); //=cir의 1000번지 찾아가서 set함수 실행시켜.
double area = cir.getArea(); //=1000번지 찾아가서 getArea함수 실행시켜.
//System.out.println("원 넓이는 " + cir.getArea());
System.out.println("원 넓이는 " + area); //이렇게 안하고 바로 위에 넣어도됨.
}
}
또다른예제
package java_rec;
public class BankAccount {
int balance = 0; //예금 잔액
public int deposit(int amount) {
balance += amount;
return balance;
}
public int withdraw(int amount) {
balance -= amount;
return balance;
}
public int checkMyBalance() {
System.out.println("잔액 : "+balance);
return balance;
}
}
package java_rec;
public class BankAccount00 {
public static void main(String[] args) {
//두 개의 인스턴스 생성
BankAccount yoon = new BankAccount(); //yoon 메모리 1000번지에 할당
BankAccount park = new BankAccount(); //park 메모리 2000번지에 할당
//★원리★어떻게 사용? .class를 메모리에 올려야 사용가능
//각 인스턴스를 대상으로 예금을 진행
yoon.deposit(5000);
park.deposit(3000);
//각 인스턴스를 대상으로 출금을 진행
yoon.withdraw(2000);
park.withdraw(2000);
//각 인스턴스를 대상으로 잔액을 조회
yoon.checkMyBalance();
park.checkMyBalance();
}
}
package java_rec;
public class DupRef {
public static void main(String[] args) {
BankAccount ref1 = new BankAccount(); //4byte 5000번지
BankAccount ref2 = ref1; //ref2는 3000번지 4byte잡고
//BankAccount를 올려놓은 메모리 주소를 가지겠다
//근데 ref1이 집어넣어졌다. - 데이터타입이 같기때문에 가능!
ref1.deposit(3000);
ref2.deposit(2000);
ref1.withdraw(400);
ref2.withdraw(300);
ref1.checkMyBalance();
ref2.checkMyBalance();
}
}//잔액 : 4300
//잔액 : 4300
package java_rec;
public class PassingRef {
public static void main(String[] args) {
BankAccount ref = new BankAccount();
ref.deposit(3000);
ref.withdraw(300);
check(ref); //'참조 값'의 전달 / 참조형도 전달할 수 있다.
}
public static void check(BankAccount acc) {//참조형 여기에 전달!
acc.checkMyBalance();
}
}
오늘의 문제
1.아래가 의도하지 않은 결과를 나타내는 이유를 설명하시오.
char ch = '가';
System.out.println(ch+'\n');
'\n'은 하나의 문자, 즉 개행 문자를 나타내는 문자 상수이기 때문이다.
'\n'을 메모리에 올리면 char데이터타입으로 올라간다.
의도대로 나오게 하고싶으면 System.out.println(ch+"\n");
→"\n"은 String데이터타입으로 메모리에 올라간다.
2.변수의 scope 는?
변수의 scope는 {중괄호안에 있는 변수의 범위}이다.
3.지역변수?(local variable)
{함수안에 있는 변수들}이다.
3-1. 인스턴스변수?(instance variable)
{ }함수밖에 있는 변수들이다.
4.펙토리얼을 구하는 재귀 함수를 만드시오.
public class Main {
public static void main(String[] args) {
System.out.println(factorial(5));
}
public static int factorial(int num) {
if(num==1) {
return 1;
}else{
return num*factorial(num-1);
}
}
}
5.클래스의 구성요소는 무엇인가?
변수와 함수
5-1. 클래스의 의미
1. 클래스명.java (반드시 클래스명이어야 함)
2. 클래스명.class (컴파일 된 파일)
6.원의 넓이는 구하는 프로그램을 아래와 같이 작성하시오.
-원클래스를 만들것
-메인 메소드를 가진 다른 클래스에서 원 객체를 생성할것
package java_prac;
public class Circle {
double radius;
public double getRadius() {
return radius;
}
public void setRadius(double radius) {
this.radius = radius;
}
public double getArea() {
return radius*radius*Math.PI;
}
}
package java_prac;
public class MainCircle {
public static void main(String[] args) {
Circle cir = new Circle();
cir.setRadius(10);
double area = cir.getArea();
System.out.println("원넓이는 : "+area);
}
}
7.객체란 무엇인가?
.class파일을 메모리에 올린것.
클래스의 인스턴스
Circle circle = new Circle();
/*
Circle → 클래스명
circle → 생성하려는 객체 이름
new → 객체 생성 키워드
Circle(); → Circle(); 함수
= → 주소를 가리킴
*/
8. 아래의 클래스에 대하여, 메모리 그림을 그리시오.
Rectangle rec = new Rectangle();
public class Rectangle {
int height;
int width;
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
public int getArea() {
return width * height;
}
}
9.클래스와 객체의 차이는 무엇인가?
클래스는 설계도, 객체는 설계도로 구현한 모든 대상
객체는 .class를 메모리에 올린것.
10.아래의 프로그램을 작성하시오.
-1 부터 num 까지 합을 구하는 class 를 작성하도록 하시오.
public class Main {
public static void main(String[] args) {
total(9);
}
public static void total(int num) {
int sum=0;
for(int i=1; i<=num; i++)
sum+=i;
System.out.println(sum);
}
}
11.아래의 클래스를 작성하시오.
StraPrint strPrint = new StarPrint();
strPrint.printTriangle(3);
System.out.println();
strPrint.printReverseTriangle(3);
===============================
*
**
***
***
**
*
package java_rec;
public class StarPrint {
public void printTriangle(**int num**) {
for(int i=1; **i<=num;** i++) {
for(int j=1; j<=i; j++) {
System.out.print("*");
}
System.out.println();
}
}
public void printReverseTriangle(**int num**) {
for(int i=1; **i<=num;** i++) {
for(int **j=num;** j>=i; j--) {
System.out.print("*");
}
System.out.println();
}
}
}
package java_rec;
public class StarPrint {
public static void main(String[] args) {
StarPrint strPrint = new StarPrint();
strPrint.printTriangle(3);
System.out.println();
strPrint.printReverseTriangle(3);
12.아래의 프로그래밍을 작성하시오.
Gugudan gugudan = new Gugudan();
gugudan.printGugu(10); //1단부터 10단까지 출력
gugudan.printGugu(20); //1단부터 20단까지 출력
package java_rec;
public class Gugudan {
public int printGugu(int num1) {
for(int i = 2; i<=num1; i++) {
for(int j=1; j<=9; j++){
System.out.println(i+"x"+j+"="+i*j);
}
System.out.println();
}
return num1;
}
}
package java_rec;
public class Gugudan00 {
public static void main(String[] args) {
Gugudan gugudan = new Gugudan();
gugudan.printGugu(10);
gugudan.printGugu(20);
}
}
13. 아래의 BankAccount 객체에 대하여 그림을 그리시오.
BankAccount ref1 = new BankAccount();
BankAccount ref2 = ref1;
'코딩 > 수업 정리' 카테고리의 다른 글
20.12.02 Wed [008] (0) | 2020.12.02 |
---|---|
참고하기 좋은 사이트 (0) | 2020.12.01 |
20.11.30 Mon [006] (0) | 2020.11.30 |
자바 자습 (0) | 2020.11.28 |
20.11.27 Fri [005] (0) | 2020.11.27 |
댓글