[21.07.12] 메소드

yed·2021년 7월 12일
0

논리적 순서가 중요한 이유는 에러가 생겼을 때 역으로 논리적 순서를 따라 추적해야하기 때문이다


메소드

클래스 내에 선언되어 있는 기능을 수행하기 위한 코드를 의미해요. 클래스 안에 여러개의 메소드가 존재할 수 있고 클래스 안에서 혹은 다른 메소드 외부에서 만들어요. 코드를 재사용하기 위해 사용하는데 메소드에 집어넣는 값에 따라서 반환값이 달라집니다. 메소드 안에 또다른 메소드를 만들순없어요

[수식어] 리턴타입 메소드이름([매개변수1,매개변수2,..]) { 본문 }

  • 수식어 : public, private, static ... [생략가능]
  • 리턴타입 : 자료타입(int, double, String, class), void
  • 매개변수 : 메소드를 호출할 때 전달하는 데이터

메소드의 사용 목적을 분명히하고 나서 만들어야 사용하지않고 공간만 차지하는 메소드 줄일 수 있어요!

  • ctrl+함수이름 : 해당 함수의 위치로 옮겨짐

이 단축키를 사용하면 함수 코드를 볼 수 있지만 매번 함수를 찾아가서 기능을 확인할 순 없잖아요? 그래서 기능을 함수의 이름으로 대충 추측할 수 있게끔 함수이름을 잘 지어야한답니다. 그리고 함수들은 서로 독립적이라 변수의 이름이 같아도 서로 다른 메소드라면 오류가 생기지않아요!

static

프로그램이 실행될 때 생성하도록 선언하는 키워드입니다. static 메소드에서는 static으로 선언된 메소드만 호출가능해요! 각 수식어들은 다음에 다시 자세하게 다뤄보아용


변수 명명 규칙

  1. 첫번째 글자는 숫자로 시작할 수 없고 문자, $, _ 만 가능함
  2. 영어 대소문자가 구분됨 (ex. int abc; int ABC; 다른 변수)
  3. 첫 문자가 영어 소문자고 그 뒤 단어의 첫 문자는 대문자 (카멜 규칙)
  4. 문자 수(길이) 제한없음
  5. 자바 예약어는 사용할 수 없음

프로그램 동작

(클라이언트) <-> (서버) <-> (데이터베이스)

클라이언트(웹사이트)와 서버가 인터넷을 통해 연결하고 있는 구조에요
파트를 나눌수록 나눠지는데 크게는 데이터를 제공하는 프론트엔드, 데이터를 저장하는 백엔드로 둘이 나뉩니다. 앱도 똑같아요.

  1. 요구사항 수집
  2. 요구사항 바탕으로 기능 정의
  3. 기능 정의를 바탕으로 검증
  4. 설계
  5. 기능 구현
  6. 기능 테스트
  7. 프로그램 배포

요구사항 단계가 가장 중요합니다 정상적으로 작동하는 프로그램이여도 요구사항과 일치하지 않는건 좋은 프로그램이 아니에요


[문제] 피보나치 수열

n>=2, f(0)=1, f(1)=1, f(2)= 2, f(3)=3, 일 때 f(19)까지의 피보나치 수열값 출력
1. f(2) : f(1)+f(0)=1+1=2
2. f(3) : f(2)+f(1)=2+1=3
3. f(4) : f(3)+f(2)=3+2=5
= f(n) : f(n-1)+f(n-2)

int[] fibo = new int[20];
fibo[0] = 1;
fibo[1] = 1;

for (int i = 0; i < fibo.length; i++) {
	if (i >= 2) {
		fibo[i] = fibo[i - 1] + fibo[i - 2];
	}
}
for (int b : fibo) {
	System.out.print(b + " ");
}

CodeUp #1096

19*19 크기의 바둑판에서 n개의 흰돌을 놓는 (x,y)좌표를 입력받기
1. 흰돌 위치는 1, 빈 바둑판은 0으로 출력
2. 만약 바둑판 전체 x:1~19, y:1~19(0~18)에서 x,y 좌표를 입력받으면 [x-1][y-1]를 1로 저장

int[][] baduk=new int[19][19];
Scanner sc=new Scanner(System.in);
int num=sc.nextInt();
int x=0,y=0;
		
for(int i=0;i<num;i++) {
	x=sc.nextInt();
	y=sc.nextInt();
	baduk[x-1][y-1]=1;
}
sc.close();

for(int[] ba:baduk) {
	for(int duk:ba) {
		if(duk!=1) {
			duk=0;
		}
		System.out.print(duk+" ");
	}
	System.out.println();
}

예외처리

배열이 null로 초기화 되어있고 조건문에서 배열의 범위을 채운다면 해당 조건문이 실행되기 전에는 배열의 null값으로 인해 에러가 발생함.
이 경우 에러발생을 막기 위해 예외처리가 필요.

System.out.println("<학생 점수 관리 프로그램>");
int[] scores=null; //학생 점수. null로 초기화. 변수만 선언하고 size를 지정안함
int studentNum=0; //학생 수
Scanner sc=new Scanner(System.in);
boolean run=true;
		
while(run) {
	System.out.println("----------------------------------------------------------");
	System.out.println("1.학생수입력 | 2.점수입력 | 3.점수목록 | 4.분석 | 5.종료");
	System.out.println("----------------------------------------------------------");
	System.out.print("선택>");
			
	int selectNo=sc.nextInt();
			
	if(selectNo==1) {
		System.out.print("학생 수를 입력하세요>");
		studentNum=sc.nextInt();
		scores=new int[studentNum];
		System.out.println("학생 수 : "+studentNum);
	}else if(selectNo==2) {
		if(scores!=null) {//예외처리
			for(int i=0;i<scores.length;i++) {
				System.out.print((i+1)+"번 학생의 점수를 입력하세요>");
				scores[i]=sc.nextInt();
			}
		}else {
			System.out.println("1번부터 진행해주세요");
		}
	}else if(selectNo==3) {
		if(scores!=null) {
			for(int score : scores) {
			System.out.println(score);
			}
		}else {
			System.out.println("1번부터 진행해주세요");
		}
	}else if(selectNo==4) {
		if(scores!=null) {
			int sum=0;
			double avg=0.0;
			for(int sco : scores) {
				sum+=sco;
			}
			avg=(double)sum/studentNum;
			System.out.println("합계 : "+sum);
			System.out.println("평균 : "+ avg);
		}else {
			System.out.println("1번부터 진행해주세요");
		}
	}else if(selectNo==5) {
		run=false;
	}else {
		System.out.println("잘못된 접근입니다.");
	}
}
sc.close();

수업 외 공부🔍

  • 버블정렬
    인접한 두 수의 크기를 비교해 더 큰수를 뒤로 옮겨 한칸씩 이동하며 정렬하는 방식입니다.
    [5 2 4 8 1]
    2 5 4 8 1 i=0, j=0
    2 4 5 8 1 ..........j=1
    2 4 5 8 1 ..........j=2
    2 4 5 1 8 ..........j=3
    2 4 5 1 8 i=1, j=0
    2 4 5 1 8 ..........j=1
    2 4 1 5 8 ..........j=2
    2 4 1 5 8 i=2, j=0
    2 1 4 5 8 ..........j=1
    1 2 4 5 8 i=3, j=0

i의 범위 : 0~length-1
j의 범위 : 0부터 한바퀴 돌때마다 length-1이 i씩 작아짐.

for(int i=0;i<num.length-1;i++) {
	for(int j=0;j<num.length-1-i;j++) {
		if(num[j]>num[j+1]) {
			temp=num[j];
			num[j]=num[j+1];
			num[j+1]=temp;
		}
	}
}
profile
6개월 국비과정 기록하기

0개의 댓글