ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 231012_JAVA
    Individual Learning/Java 2023. 10. 12. 23:02

    아직 아스키 코드값을 매치하는게 잘 되지 않는다.

    더보기
    아스키 코드를 좀 더 제대로 이해할 필요가 있다.

    덕분에 'counts[alphabet - 'a']++;' 를 이해하는데 조금 시간이 오래 걸린 것 같다.

    아무튼 이해는 됐는데... 첫 번째 시도는 a~z 를 한번 비교한 뒤, A~Z를 비교해서 else if 문이 쓰였다.

    참고로 char는 문자 데이터 유형을 나타내는데... 데이터 유형의 종류에 대해 알아둬야 할 것 같다.

    package Assignment;
    
    public class Training_1012_5 {
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		
    		// 기존의 과제물을 응용해서 알파벳 대소문자를 구분하지 않고 a 부터 z 까지 for 문을 응용해 개수를 구해보자.
    		// a부터 z까지 하나하나 지정할 수도 있지만 효율이 좋지 않다.
    		// 아스키 코드를 이용해서 자동으로 a~z까지 개수를 구하게 끔 해보자... 
    		
    		String little = "Once when I was six years old I saw a magnificent picture in a book,"
    		+ "called True Stories from Nature, about the primeval forest."
    		+ "nIt was a picture of a boa constrictor in the act of swallowing an animal. Here is a copy of the drawing. ";
    		
    		int[] counts = new int[26]; // a~z까지 알파벳을 저장할 배열 
    		
    		for (int i = 0; i < little.length(); i++) { 
    			char alphabet = little.charAt(i);
    			// little.length() 을 통해 String little 의 문장을 읽어들임.
    			// i 를 0으로 초기화 한 뒤, 읽어들인 문장을 i에 부여함
    			// 문장의 길이만큼 반복... 반복하는 이유는 문자열의 문자에 하나씩 접근하기 위함
    			// 읽어들인 문자를 변수 alphabet 에 할당 
    			
    			if (alphabet >= 'a' && alphabet <= 'z') {
    				// if문을 이용해서 alphabet에 할당된 소문자 a~z를 확인
    
    			counts[alphabet - 'a']++; 
    			//알파벳 배열에서 소문자 아스키 a 코드값을 빼고, 알파벳 갯수 카운팅을 위해 counts (알파벳을 저장한 배열) 에 1씩 증가
    			// 입력된 문자열에서 'a'가 1번 나타난 경우, 'counts' 배열의 0번 인덱스 값을 증가한다.
    
    			// counts[0]++ 은 a 를 1번 증가함을 의미, counts[1]++ 은 b를 1번 증가함을 의미... 
    			// 'alphabet - 'a' 는 검사중인 문자 alphabet 의 아스키 코드값에서 'a'의 아스키 코드값을 뺌. 
    			
    			// 만약 a 알파벳 개수를 셀 경우, a의 아스키 코드값은 97 이므로 [alphabet - 97]이 되고 이는 a를 의미함.
    			// 즉 counts[alphabet - 97]++ 는 counts 배열에 저장된 a를 1 증가함을 의미.
    
    			} else if (alphabet >= 'A' && alphabet <= 'Z') { 
    				//if에 해당되지 않는 나머지 (대문자)를 판별, alphabet에 할당된 A~Z를 확인
    				
    			counts[alphabet - 'A']++; 
    			//알파벳 배열에서 대문자 아스키 A 코드값을 뺀 뒤 counts (알파벳을 저장한 배열) 에 1씩 증가
    			}
    			}
    			for (int i = 0; i < 26; i++) { //알파벳은 26개이므로 26번 반복
    			char letter = (char) ('a' + i); // 아스키 a 코드 값에 i를 더한 뒤 char 형식으로 변환, letter에 저장
    			System.out.println(letter + " 는 ... " + counts[i] + " 개"); //개수 출력 
    			}
    		}
    	}

    불필요한 설명은 모두 빼고, A~z 까지 한꺼번에 비교해볼 수 있도록 좀 더 수정해봤다.

    왜인지 오류가 뜬다. 왜 오류인지는 모르겠다... 위에꺼는 되는데 아래꺼는 안 된다... 왜일까?? 

    package Assignment;
    
    public class Training_1012_5 {
    
    	public static void main(String[] args) {
    	String little = "Once when I was six years old I saw a magnificent picture in a book,"
    	+ "called True Stories from Nature, about the primeval forest."
    	+ "nIt was a picture of a boa constrictor in the act of swallowing an animal. Here is a copy of the drawing. ";
        
    		int[] counts = new int[26]; 
    		for (int i = 0; i < little.length(); i++) { 
    		char alphabet = little.charAt(i);
            
    		if ((alphabet >= 'a' && alphabet <= 'z') || (alphabet >= 'A' && alphabet <= 'Z')) {
    			counts[alphabet - 'a']++; 
    			} 
    		}
    		for (int i = 0; i < 26; i++) { 
    			char letter = (char) ('a' + i); 
    			System.out.println(letter + " 는 ... " + counts[i] + " 개"); 
    		}
    	}
    }

    구글링과 인공지능의 도움을 받아서 해결했다.

    counts 배열의 인덱스를 계산할 때, 음수 값이 나타나서 배열의 범위를 벗어나 오류가 일어났었다.

    package Assignment;
    
    public class Training_1012_6 {
    
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		
    		String little = "Once when I was six years old I saw a magnificent picture in a book,"
    				+ "called True Stories from Nature, about the primeval forest."
    				+ "nIt was a picture of a boa constrictor in the act of swallowing an animal. Here is a copy of the drawing. ";
    		
    		int[] counts = new int[52]; // 대문자와 소문자 알파벳을 모두 저장할 배열
    		
    		for (int i = 0; i < little.length(); i++) { 
    		    char alphabet = little.charAt(i);
    		    
    		    if ((alphabet >= 'a' && alphabet <= 'z') || (alphabet >= 'A' && alphabet <= 'Z')) {
    		        if (alphabet >= 'a' && alphabet <= 'z') {
    		            counts[alphabet - 'a']++; // 소문자 알파벳
    		        } else {
    		            counts[alphabet - 'A' + 26]++; // 대문자 알파벳
    		        }
    		    }
    		}
    		for (int i = 0; i < 26; i++) { //알파벳은 26개이므로 26번 반복
                char letter = (char) ('a' + i); // 아스키 a 코드 값에 i를 더한 뒤 char 형식으로 변환, letter에 저장
                System.out.println(letter + " 는 ... " + counts[i] + " 개"); //개수 출력
    		}
    	}
    }

     

    if ((alphabet >= 'a' && alphabet <= 'z') || (alphabet >= 'A' && alphabet <= 'Z')) 을 통해 알파벳을 확인을 했지만, 
    counts[alphabet - 'a']++; 에서 배열의 인덱스를 계산할 때 음수값이 나타나 배열의 범위를 벗어나 오류가 일어났었다... 잘 이해가 되지 않지만 인덱스 계산 부분이 문제였음.

    인덱스를 계산하는 부분을 소문자와 대문자 알파벳을 따로 구분해서 계산할 수 있도록 했을 때 문제없이 해결 되었다. 대문자 인덱스를 계산할 때  26을 붙이는 이유는 26 부터 51까지의 범위를 사용하기 때문. 

     

    좀 더 심도 깊게 이해를 하기 위해... 주말을 투자하기로 했다.

     

    헤멘것에 비해 결과물은 똑같다.

     

    'Individual Learning > Java' 카테고리의 다른 글

    231024_Java 7장  (0) 2023.10.24
    231021_Java 6장  (0) 2023.10.22
    231012_Java예제  (0) 2023.10.17
    231002_Java  (0) 2023.10.17
    231012_Java 10.11 과제물 보충  (0) 2023.10.12
Designed by Tistory.