본문 바로가기
코딩/수업 정리

20.12.01 Tue [007]

by 6^6 2020. 12. 1.
728x90
  • 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;

 

 

 

 

728x90

'코딩 > 수업 정리' 카테고리의 다른 글

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

댓글