본문 바로가기
Project

자바스크립트로 입력값 모음 개수 카운터 프로그램 만들기

by 보라코끼리 2021. 10. 20.
728x90

메인 화면
결과 화면

  • 영문과 숫자만 입력이 가능한 칸을 만든다.
  • 확인해보기를 누르면 입력값 중 모음(a, e, i, o, u)의 개수를 소문자, 대문자 상관없이 구한다.
  • 구해진 모음의 개수를 테이블 형식으로 출력한다.

1단계 : HTML 형식으로 표현

  • 메인 화면의 틀을 html로 잡아준다.
<form>
    <label for="alpha">문자 카운터(모음)</label><br/>
    <textarea id="alpha" placeholder="영어와 숫자만 입력가능합니다" roww="4" cols="50" onKeyup="this.value = this.value.replace(/[^a-zA-Z0-9\s]/g,'');"></textarea></br>
    <input type="submit" value="확인해보기" onclick="countVowel()"/>
</form>
  • 사용한 태그
    • <form> 태그
      • <input> 태그의 type="submit" 속성을 이용하기 위해 <form> 태그를 사용하였다.
    • <label> 태그
      • <textarea> 태그의 id="alpha" 속성을 이용하기 위해 for="alpha" 속성을 표시한 <label> 태그를 사용하였다.
    • <textarea> 태그
      • 영문과 숫자의 입력을 문자열로 받기 위해 <input> 태그의 type="text"가 아닌 <textarea> 태그를 사용하였다. <input> 태그의 경우 긴 문장을 적을 경우 문자열이 잘리는 현상을 방지하기 위함이다.
    • <input> 태그
      • <form> 에서 작성한 부분을 javascript의 countVowel() 함수와 연결하기 위해 type="submit" 속성을 이용하여 <input> 태그를 작성하였다.
      • 확인해보기를 클릭하면 함수 countVowel()로 연결되기 위해 onclick속성을 사용하였다.

  • 문자 카운터(모음)
    • <textarea> 속성 중 onKeyup을 이용하여 영문과 숫자만 입력할 수 있도록 해두었다.
    • 사용자가 <textarea>에 문자열을 입력하여 확인해보기를 누르면 문자열 중 모음의 개수를 표시해준다.

2단계 : 자바스크립트로 countVowel() 함수 구현

  • <input> 태그의 onclick="countVowel()" 속성으로 클릭시 호출된다.
function countVowel() {
    var alpha = document.getElementById("alpha").value;
    var splitedAlpha = alpha.split('');
    var alphaObj = {};
    var alphaCount = ['a', 'e', 'i', 'o', 'u'];
    
    // 모음 개수 출력
    document.write('<table border = "1">');
    for (i = 0; i < alphaCount.length; i++) {
        var number_vowels = 0;
        for (j = 0; j < splitedAlpha.length; j++) {
            if (alphaCount[i] == splitedAlpha[j].toLowerCase()) {
                number_vowels++;
            }
        }
        alphaObj = {name: alphaCount[i], number: number_vowels};
        document.write('<tr><td>' + alphaObj.name + '</td><td>' + alphaObj.number + '개 </td></tr>');
        
    }
    document.write('</table>');
}
728x90
  • 사용한 변수
    • alpha : <textarea>에서 id="alpha"로 입력받은 값을 alpha 변수에 담았다.
    • splitedAlpha : alpha 변수를 한 문자씩 나눈 값을 splitedAlpha 변수에 담았다.
    • alphaObj : 모음 문자와 개수를 각각 name, number로 표현해서 묶어주기 위해 alphaObj 객체를 사용하였다.
    • alphaCount : 모음 문자와의 비교를 위해 이들을 배열로 담아 표현해두었다.
  • 모음 개수 출력
    • 테이블 형태로 표현하기 위해 우선 border="1"로 하여 테이블을 선언하였다.
    • 모음의 개수만 확인하면 되기 때문에 alphaCount의 length 만큼 반복문을 도는 동안 splitedAlpha 문자열을 반복문을 돌며 확인하는 형태로 진행하였다.
      • 이 때, 소문자와 대문자의 구별이 없게 진행되도록 하기 위해서 toLowerCase() 함수를 통해 모두 소문자로 바꾼 후 확인하도록 하였다.
    • 각 모음마다 확인이 끝나면 모음 문자를 name에, 개수를 number에 넣은 객체 alphaObj를 만들었고 이를 각각 <td></td> 태그에 넣어주었다.

전체 코드

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <form>
        <label for="alpha">문자 카운터(모음)</label><br>
        <textarea id="alpha" placeholder="영어와 숫자만 입력가능합니다." rows="4" cols = "50" onKeyup = "this.value = this.value.replace(/[^a-zA-Z0-9\s]/g,'');"></textarea><br>
        <input type="submit" value="확인해보기" onclick="countVowel()">
    </form>

    <script>
        function countVowel() {
            var alpha = document.getElementById("alpha").value;
            var splitedAlpha = alpha.split('');
            var alphaObj = {};
            var alphaCount = ['a', 'e', 'i', 'o', 'u'];
            
            // 모음 개수 출력
            document.write('<table border = "1">');
            for (i = 0; i < alphaCount.length; i++) {
                var number_vowels = 0;
                for (j = 0; j < splitedAlpha.length; j++) {
                    if (alphaCount[i] == splitedAlpha[j].toLowerCase()) {
                        number_vowels++;
                    }
                }
                alphaObj = {name: alphaCount[i], number: number_vowels};
                document.write('<tr><td>' + alphaObj.name + '</td><td>' + alphaObj.number + '개 </td></tr>');
                
            }
            document.write('</table>');
        }
    </script>
</body>
</html>
728x90